lfx-nightly 0.2.0.dev25__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (769) hide show
  1. lfx/__init__.py +0 -0
  2. lfx/__main__.py +25 -0
  3. lfx/_assets/component_index.json +1 -0
  4. lfx/base/__init__.py +0 -0
  5. lfx/base/agents/__init__.py +0 -0
  6. lfx/base/agents/agent.py +375 -0
  7. lfx/base/agents/altk_base_agent.py +380 -0
  8. lfx/base/agents/altk_tool_wrappers.py +565 -0
  9. lfx/base/agents/callback.py +130 -0
  10. lfx/base/agents/context.py +109 -0
  11. lfx/base/agents/crewai/__init__.py +0 -0
  12. lfx/base/agents/crewai/crew.py +231 -0
  13. lfx/base/agents/crewai/tasks.py +12 -0
  14. lfx/base/agents/default_prompts.py +23 -0
  15. lfx/base/agents/errors.py +15 -0
  16. lfx/base/agents/events.py +430 -0
  17. lfx/base/agents/utils.py +237 -0
  18. lfx/base/astra_assistants/__init__.py +0 -0
  19. lfx/base/astra_assistants/util.py +171 -0
  20. lfx/base/chains/__init__.py +0 -0
  21. lfx/base/chains/model.py +19 -0
  22. lfx/base/composio/__init__.py +0 -0
  23. lfx/base/composio/composio_base.py +2584 -0
  24. lfx/base/compressors/__init__.py +0 -0
  25. lfx/base/compressors/model.py +60 -0
  26. lfx/base/constants.py +46 -0
  27. lfx/base/curl/__init__.py +0 -0
  28. lfx/base/curl/parse.py +188 -0
  29. lfx/base/data/__init__.py +5 -0
  30. lfx/base/data/base_file.py +810 -0
  31. lfx/base/data/docling_utils.py +338 -0
  32. lfx/base/data/storage_utils.py +192 -0
  33. lfx/base/data/utils.py +362 -0
  34. lfx/base/datastax/__init__.py +5 -0
  35. lfx/base/datastax/astradb_base.py +896 -0
  36. lfx/base/document_transformers/__init__.py +0 -0
  37. lfx/base/document_transformers/model.py +43 -0
  38. lfx/base/embeddings/__init__.py +0 -0
  39. lfx/base/embeddings/aiml_embeddings.py +62 -0
  40. lfx/base/embeddings/embeddings_class.py +113 -0
  41. lfx/base/embeddings/model.py +26 -0
  42. lfx/base/flow_processing/__init__.py +0 -0
  43. lfx/base/flow_processing/utils.py +86 -0
  44. lfx/base/huggingface/__init__.py +0 -0
  45. lfx/base/huggingface/model_bridge.py +133 -0
  46. lfx/base/io/__init__.py +0 -0
  47. lfx/base/io/chat.py +21 -0
  48. lfx/base/io/text.py +22 -0
  49. lfx/base/knowledge_bases/__init__.py +3 -0
  50. lfx/base/knowledge_bases/knowledge_base_utils.py +137 -0
  51. lfx/base/langchain_utilities/__init__.py +0 -0
  52. lfx/base/langchain_utilities/model.py +35 -0
  53. lfx/base/langchain_utilities/spider_constants.py +1 -0
  54. lfx/base/langwatch/__init__.py +0 -0
  55. lfx/base/langwatch/utils.py +18 -0
  56. lfx/base/mcp/__init__.py +0 -0
  57. lfx/base/mcp/constants.py +2 -0
  58. lfx/base/mcp/util.py +1659 -0
  59. lfx/base/memory/__init__.py +0 -0
  60. lfx/base/memory/memory.py +49 -0
  61. lfx/base/memory/model.py +38 -0
  62. lfx/base/models/__init__.py +3 -0
  63. lfx/base/models/aiml_constants.py +51 -0
  64. lfx/base/models/anthropic_constants.py +51 -0
  65. lfx/base/models/aws_constants.py +151 -0
  66. lfx/base/models/chat_result.py +76 -0
  67. lfx/base/models/cometapi_constants.py +54 -0
  68. lfx/base/models/google_generative_ai_constants.py +70 -0
  69. lfx/base/models/google_generative_ai_model.py +38 -0
  70. lfx/base/models/groq_constants.py +150 -0
  71. lfx/base/models/groq_model_discovery.py +265 -0
  72. lfx/base/models/model.py +375 -0
  73. lfx/base/models/model_input_constants.py +378 -0
  74. lfx/base/models/model_metadata.py +41 -0
  75. lfx/base/models/model_utils.py +108 -0
  76. lfx/base/models/novita_constants.py +35 -0
  77. lfx/base/models/ollama_constants.py +52 -0
  78. lfx/base/models/openai_constants.py +129 -0
  79. lfx/base/models/sambanova_constants.py +18 -0
  80. lfx/base/models/watsonx_constants.py +36 -0
  81. lfx/base/processing/__init__.py +0 -0
  82. lfx/base/prompts/__init__.py +0 -0
  83. lfx/base/prompts/api_utils.py +224 -0
  84. lfx/base/prompts/utils.py +61 -0
  85. lfx/base/textsplitters/__init__.py +0 -0
  86. lfx/base/textsplitters/model.py +28 -0
  87. lfx/base/tools/__init__.py +0 -0
  88. lfx/base/tools/base.py +26 -0
  89. lfx/base/tools/component_tool.py +325 -0
  90. lfx/base/tools/constants.py +49 -0
  91. lfx/base/tools/flow_tool.py +132 -0
  92. lfx/base/tools/run_flow.py +698 -0
  93. lfx/base/vectorstores/__init__.py +0 -0
  94. lfx/base/vectorstores/model.py +193 -0
  95. lfx/base/vectorstores/utils.py +22 -0
  96. lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
  97. lfx/cli/__init__.py +5 -0
  98. lfx/cli/commands.py +327 -0
  99. lfx/cli/common.py +650 -0
  100. lfx/cli/run.py +506 -0
  101. lfx/cli/script_loader.py +289 -0
  102. lfx/cli/serve_app.py +546 -0
  103. lfx/cli/validation.py +69 -0
  104. lfx/components/FAISS/__init__.py +34 -0
  105. lfx/components/FAISS/faiss.py +111 -0
  106. lfx/components/Notion/__init__.py +19 -0
  107. lfx/components/Notion/add_content_to_page.py +269 -0
  108. lfx/components/Notion/create_page.py +94 -0
  109. lfx/components/Notion/list_database_properties.py +68 -0
  110. lfx/components/Notion/list_pages.py +122 -0
  111. lfx/components/Notion/list_users.py +77 -0
  112. lfx/components/Notion/page_content_viewer.py +93 -0
  113. lfx/components/Notion/search.py +111 -0
  114. lfx/components/Notion/update_page_property.py +114 -0
  115. lfx/components/__init__.py +428 -0
  116. lfx/components/_importing.py +42 -0
  117. lfx/components/agentql/__init__.py +3 -0
  118. lfx/components/agentql/agentql_api.py +151 -0
  119. lfx/components/aiml/__init__.py +37 -0
  120. lfx/components/aiml/aiml.py +115 -0
  121. lfx/components/aiml/aiml_embeddings.py +37 -0
  122. lfx/components/altk/__init__.py +34 -0
  123. lfx/components/altk/altk_agent.py +193 -0
  124. lfx/components/amazon/__init__.py +36 -0
  125. lfx/components/amazon/amazon_bedrock_converse.py +195 -0
  126. lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
  127. lfx/components/amazon/amazon_bedrock_model.py +130 -0
  128. lfx/components/amazon/s3_bucket_uploader.py +211 -0
  129. lfx/components/anthropic/__init__.py +34 -0
  130. lfx/components/anthropic/anthropic.py +187 -0
  131. lfx/components/apify/__init__.py +5 -0
  132. lfx/components/apify/apify_actor.py +325 -0
  133. lfx/components/arxiv/__init__.py +3 -0
  134. lfx/components/arxiv/arxiv.py +169 -0
  135. lfx/components/assemblyai/__init__.py +46 -0
  136. lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
  137. lfx/components/assemblyai/assemblyai_lemur.py +183 -0
  138. lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
  139. lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
  140. lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
  141. lfx/components/azure/__init__.py +37 -0
  142. lfx/components/azure/azure_openai.py +95 -0
  143. lfx/components/azure/azure_openai_embeddings.py +83 -0
  144. lfx/components/baidu/__init__.py +32 -0
  145. lfx/components/baidu/baidu_qianfan_chat.py +113 -0
  146. lfx/components/bing/__init__.py +3 -0
  147. lfx/components/bing/bing_search_api.py +61 -0
  148. lfx/components/cassandra/__init__.py +40 -0
  149. lfx/components/cassandra/cassandra.py +264 -0
  150. lfx/components/cassandra/cassandra_chat.py +92 -0
  151. lfx/components/cassandra/cassandra_graph.py +238 -0
  152. lfx/components/chains/__init__.py +3 -0
  153. lfx/components/chroma/__init__.py +34 -0
  154. lfx/components/chroma/chroma.py +169 -0
  155. lfx/components/cleanlab/__init__.py +40 -0
  156. lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
  157. lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
  158. lfx/components/cleanlab/cleanlab_remediator.py +131 -0
  159. lfx/components/clickhouse/__init__.py +34 -0
  160. lfx/components/clickhouse/clickhouse.py +135 -0
  161. lfx/components/cloudflare/__init__.py +32 -0
  162. lfx/components/cloudflare/cloudflare.py +81 -0
  163. lfx/components/cohere/__init__.py +40 -0
  164. lfx/components/cohere/cohere_embeddings.py +81 -0
  165. lfx/components/cohere/cohere_models.py +46 -0
  166. lfx/components/cohere/cohere_rerank.py +51 -0
  167. lfx/components/cometapi/__init__.py +32 -0
  168. lfx/components/cometapi/cometapi.py +166 -0
  169. lfx/components/composio/__init__.py +222 -0
  170. lfx/components/composio/agentql_composio.py +11 -0
  171. lfx/components/composio/agiled_composio.py +11 -0
  172. lfx/components/composio/airtable_composio.py +11 -0
  173. lfx/components/composio/apollo_composio.py +11 -0
  174. lfx/components/composio/asana_composio.py +11 -0
  175. lfx/components/composio/attio_composio.py +11 -0
  176. lfx/components/composio/bitbucket_composio.py +11 -0
  177. lfx/components/composio/bolna_composio.py +11 -0
  178. lfx/components/composio/brightdata_composio.py +11 -0
  179. lfx/components/composio/calendly_composio.py +11 -0
  180. lfx/components/composio/canva_composio.py +11 -0
  181. lfx/components/composio/canvas_composio.py +11 -0
  182. lfx/components/composio/coda_composio.py +11 -0
  183. lfx/components/composio/composio_api.py +278 -0
  184. lfx/components/composio/contentful_composio.py +11 -0
  185. lfx/components/composio/digicert_composio.py +11 -0
  186. lfx/components/composio/discord_composio.py +11 -0
  187. lfx/components/composio/dropbox_compnent.py +11 -0
  188. lfx/components/composio/elevenlabs_composio.py +11 -0
  189. lfx/components/composio/exa_composio.py +11 -0
  190. lfx/components/composio/figma_composio.py +11 -0
  191. lfx/components/composio/finage_composio.py +11 -0
  192. lfx/components/composio/firecrawl_composio.py +11 -0
  193. lfx/components/composio/fireflies_composio.py +11 -0
  194. lfx/components/composio/fixer_composio.py +11 -0
  195. lfx/components/composio/flexisign_composio.py +11 -0
  196. lfx/components/composio/freshdesk_composio.py +11 -0
  197. lfx/components/composio/github_composio.py +11 -0
  198. lfx/components/composio/gmail_composio.py +38 -0
  199. lfx/components/composio/googlebigquery_composio.py +11 -0
  200. lfx/components/composio/googlecalendar_composio.py +11 -0
  201. lfx/components/composio/googleclassroom_composio.py +11 -0
  202. lfx/components/composio/googledocs_composio.py +11 -0
  203. lfx/components/composio/googlemeet_composio.py +11 -0
  204. lfx/components/composio/googlesheets_composio.py +11 -0
  205. lfx/components/composio/googletasks_composio.py +8 -0
  206. lfx/components/composio/heygen_composio.py +11 -0
  207. lfx/components/composio/instagram_composio.py +11 -0
  208. lfx/components/composio/jira_composio.py +11 -0
  209. lfx/components/composio/jotform_composio.py +11 -0
  210. lfx/components/composio/klaviyo_composio.py +11 -0
  211. lfx/components/composio/linear_composio.py +11 -0
  212. lfx/components/composio/listennotes_composio.py +11 -0
  213. lfx/components/composio/mem0_composio.py +11 -0
  214. lfx/components/composio/miro_composio.py +11 -0
  215. lfx/components/composio/missive_composio.py +11 -0
  216. lfx/components/composio/notion_composio.py +11 -0
  217. lfx/components/composio/onedrive_composio.py +11 -0
  218. lfx/components/composio/outlook_composio.py +11 -0
  219. lfx/components/composio/pandadoc_composio.py +11 -0
  220. lfx/components/composio/peopledatalabs_composio.py +11 -0
  221. lfx/components/composio/perplexityai_composio.py +11 -0
  222. lfx/components/composio/reddit_composio.py +11 -0
  223. lfx/components/composio/serpapi_composio.py +11 -0
  224. lfx/components/composio/slack_composio.py +11 -0
  225. lfx/components/composio/slackbot_composio.py +11 -0
  226. lfx/components/composio/snowflake_composio.py +11 -0
  227. lfx/components/composio/supabase_composio.py +11 -0
  228. lfx/components/composio/tavily_composio.py +11 -0
  229. lfx/components/composio/timelinesai_composio.py +11 -0
  230. lfx/components/composio/todoist_composio.py +11 -0
  231. lfx/components/composio/wrike_composio.py +11 -0
  232. lfx/components/composio/youtube_composio.py +11 -0
  233. lfx/components/confluence/__init__.py +3 -0
  234. lfx/components/confluence/confluence.py +84 -0
  235. lfx/components/couchbase/__init__.py +34 -0
  236. lfx/components/couchbase/couchbase.py +102 -0
  237. lfx/components/crewai/__init__.py +49 -0
  238. lfx/components/crewai/crewai.py +108 -0
  239. lfx/components/crewai/hierarchical_crew.py +47 -0
  240. lfx/components/crewai/hierarchical_task.py +45 -0
  241. lfx/components/crewai/sequential_crew.py +53 -0
  242. lfx/components/crewai/sequential_task.py +74 -0
  243. lfx/components/crewai/sequential_task_agent.py +144 -0
  244. lfx/components/cuga/__init__.py +34 -0
  245. lfx/components/cuga/cuga_agent.py +730 -0
  246. lfx/components/custom_component/__init__.py +34 -0
  247. lfx/components/custom_component/custom_component.py +31 -0
  248. lfx/components/data/__init__.py +114 -0
  249. lfx/components/data_source/__init__.py +58 -0
  250. lfx/components/data_source/api_request.py +577 -0
  251. lfx/components/data_source/csv_to_data.py +101 -0
  252. lfx/components/data_source/json_to_data.py +106 -0
  253. lfx/components/data_source/mock_data.py +398 -0
  254. lfx/components/data_source/news_search.py +166 -0
  255. lfx/components/data_source/rss.py +71 -0
  256. lfx/components/data_source/sql_executor.py +101 -0
  257. lfx/components/data_source/url.py +311 -0
  258. lfx/components/data_source/web_search.py +326 -0
  259. lfx/components/datastax/__init__.py +76 -0
  260. lfx/components/datastax/astradb_assistant_manager.py +307 -0
  261. lfx/components/datastax/astradb_chatmemory.py +40 -0
  262. lfx/components/datastax/astradb_cql.py +288 -0
  263. lfx/components/datastax/astradb_graph.py +217 -0
  264. lfx/components/datastax/astradb_tool.py +378 -0
  265. lfx/components/datastax/astradb_vectorize.py +122 -0
  266. lfx/components/datastax/astradb_vectorstore.py +449 -0
  267. lfx/components/datastax/create_assistant.py +59 -0
  268. lfx/components/datastax/create_thread.py +33 -0
  269. lfx/components/datastax/dotenv.py +36 -0
  270. lfx/components/datastax/get_assistant.py +38 -0
  271. lfx/components/datastax/getenvvar.py +31 -0
  272. lfx/components/datastax/graph_rag.py +141 -0
  273. lfx/components/datastax/hcd.py +315 -0
  274. lfx/components/datastax/list_assistants.py +26 -0
  275. lfx/components/datastax/run.py +90 -0
  276. lfx/components/deactivated/__init__.py +15 -0
  277. lfx/components/deactivated/amazon_kendra.py +66 -0
  278. lfx/components/deactivated/chat_litellm_model.py +158 -0
  279. lfx/components/deactivated/code_block_extractor.py +26 -0
  280. lfx/components/deactivated/documents_to_data.py +22 -0
  281. lfx/components/deactivated/embed.py +16 -0
  282. lfx/components/deactivated/extract_key_from_data.py +46 -0
  283. lfx/components/deactivated/json_document_builder.py +57 -0
  284. lfx/components/deactivated/list_flows.py +20 -0
  285. lfx/components/deactivated/mcp_sse.py +61 -0
  286. lfx/components/deactivated/mcp_stdio.py +62 -0
  287. lfx/components/deactivated/merge_data.py +93 -0
  288. lfx/components/deactivated/message.py +37 -0
  289. lfx/components/deactivated/metal.py +54 -0
  290. lfx/components/deactivated/multi_query.py +59 -0
  291. lfx/components/deactivated/retriever.py +43 -0
  292. lfx/components/deactivated/selective_passthrough.py +77 -0
  293. lfx/components/deactivated/should_run_next.py +40 -0
  294. lfx/components/deactivated/split_text.py +63 -0
  295. lfx/components/deactivated/store_message.py +24 -0
  296. lfx/components/deactivated/sub_flow.py +124 -0
  297. lfx/components/deactivated/vectara_self_query.py +76 -0
  298. lfx/components/deactivated/vector_store.py +24 -0
  299. lfx/components/deepseek/__init__.py +34 -0
  300. lfx/components/deepseek/deepseek.py +136 -0
  301. lfx/components/docling/__init__.py +43 -0
  302. lfx/components/docling/chunk_docling_document.py +186 -0
  303. lfx/components/docling/docling_inline.py +238 -0
  304. lfx/components/docling/docling_remote.py +195 -0
  305. lfx/components/docling/export_docling_document.py +117 -0
  306. lfx/components/documentloaders/__init__.py +3 -0
  307. lfx/components/duckduckgo/__init__.py +3 -0
  308. lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
  309. lfx/components/elastic/__init__.py +37 -0
  310. lfx/components/elastic/elasticsearch.py +267 -0
  311. lfx/components/elastic/opensearch.py +789 -0
  312. lfx/components/elastic/opensearch_multimodal.py +1575 -0
  313. lfx/components/embeddings/__init__.py +37 -0
  314. lfx/components/embeddings/similarity.py +77 -0
  315. lfx/components/embeddings/text_embedder.py +65 -0
  316. lfx/components/exa/__init__.py +3 -0
  317. lfx/components/exa/exa_search.py +68 -0
  318. lfx/components/files_and_knowledge/__init__.py +47 -0
  319. lfx/components/files_and_knowledge/directory.py +113 -0
  320. lfx/components/files_and_knowledge/file.py +841 -0
  321. lfx/components/files_and_knowledge/ingestion.py +694 -0
  322. lfx/components/files_and_knowledge/retrieval.py +264 -0
  323. lfx/components/files_and_knowledge/save_file.py +746 -0
  324. lfx/components/firecrawl/__init__.py +43 -0
  325. lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
  326. lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
  327. lfx/components/firecrawl/firecrawl_map_api.py +89 -0
  328. lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
  329. lfx/components/flow_controls/__init__.py +58 -0
  330. lfx/components/flow_controls/conditional_router.py +208 -0
  331. lfx/components/flow_controls/data_conditional_router.py +126 -0
  332. lfx/components/flow_controls/flow_tool.py +111 -0
  333. lfx/components/flow_controls/listen.py +29 -0
  334. lfx/components/flow_controls/loop.py +163 -0
  335. lfx/components/flow_controls/notify.py +88 -0
  336. lfx/components/flow_controls/pass_message.py +36 -0
  337. lfx/components/flow_controls/run_flow.py +108 -0
  338. lfx/components/flow_controls/sub_flow.py +115 -0
  339. lfx/components/git/__init__.py +4 -0
  340. lfx/components/git/git.py +262 -0
  341. lfx/components/git/gitextractor.py +196 -0
  342. lfx/components/glean/__init__.py +3 -0
  343. lfx/components/glean/glean_search_api.py +173 -0
  344. lfx/components/google/__init__.py +17 -0
  345. lfx/components/google/gmail.py +193 -0
  346. lfx/components/google/google_bq_sql_executor.py +157 -0
  347. lfx/components/google/google_drive.py +92 -0
  348. lfx/components/google/google_drive_search.py +152 -0
  349. lfx/components/google/google_generative_ai.py +144 -0
  350. lfx/components/google/google_generative_ai_embeddings.py +141 -0
  351. lfx/components/google/google_oauth_token.py +89 -0
  352. lfx/components/google/google_search_api_core.py +68 -0
  353. lfx/components/google/google_serper_api_core.py +74 -0
  354. lfx/components/groq/__init__.py +34 -0
  355. lfx/components/groq/groq.py +143 -0
  356. lfx/components/helpers/__init__.py +154 -0
  357. lfx/components/homeassistant/__init__.py +7 -0
  358. lfx/components/homeassistant/home_assistant_control.py +152 -0
  359. lfx/components/homeassistant/list_home_assistant_states.py +137 -0
  360. lfx/components/huggingface/__init__.py +37 -0
  361. lfx/components/huggingface/huggingface.py +199 -0
  362. lfx/components/huggingface/huggingface_inference_api.py +106 -0
  363. lfx/components/ibm/__init__.py +34 -0
  364. lfx/components/ibm/watsonx.py +207 -0
  365. lfx/components/ibm/watsonx_embeddings.py +135 -0
  366. lfx/components/icosacomputing/__init__.py +5 -0
  367. lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
  368. lfx/components/input_output/__init__.py +40 -0
  369. lfx/components/input_output/chat.py +109 -0
  370. lfx/components/input_output/chat_output.py +184 -0
  371. lfx/components/input_output/text.py +27 -0
  372. lfx/components/input_output/text_output.py +29 -0
  373. lfx/components/input_output/webhook.py +56 -0
  374. lfx/components/jigsawstack/__init__.py +23 -0
  375. lfx/components/jigsawstack/ai_scrape.py +126 -0
  376. lfx/components/jigsawstack/ai_web_search.py +136 -0
  377. lfx/components/jigsawstack/file_read.py +115 -0
  378. lfx/components/jigsawstack/file_upload.py +94 -0
  379. lfx/components/jigsawstack/image_generation.py +205 -0
  380. lfx/components/jigsawstack/nsfw.py +60 -0
  381. lfx/components/jigsawstack/object_detection.py +124 -0
  382. lfx/components/jigsawstack/sentiment.py +112 -0
  383. lfx/components/jigsawstack/text_to_sql.py +90 -0
  384. lfx/components/jigsawstack/text_translate.py +77 -0
  385. lfx/components/jigsawstack/vocr.py +107 -0
  386. lfx/components/knowledge_bases/__init__.py +89 -0
  387. lfx/components/langchain_utilities/__init__.py +109 -0
  388. lfx/components/langchain_utilities/character.py +53 -0
  389. lfx/components/langchain_utilities/conversation.py +59 -0
  390. lfx/components/langchain_utilities/csv_agent.py +175 -0
  391. lfx/components/langchain_utilities/fake_embeddings.py +26 -0
  392. lfx/components/langchain_utilities/html_link_extractor.py +35 -0
  393. lfx/components/langchain_utilities/json_agent.py +100 -0
  394. lfx/components/langchain_utilities/langchain_hub.py +126 -0
  395. lfx/components/langchain_utilities/language_recursive.py +49 -0
  396. lfx/components/langchain_utilities/language_semantic.py +138 -0
  397. lfx/components/langchain_utilities/llm_checker.py +39 -0
  398. lfx/components/langchain_utilities/llm_math.py +42 -0
  399. lfx/components/langchain_utilities/natural_language.py +61 -0
  400. lfx/components/langchain_utilities/openai_tools.py +53 -0
  401. lfx/components/langchain_utilities/openapi.py +48 -0
  402. lfx/components/langchain_utilities/recursive_character.py +60 -0
  403. lfx/components/langchain_utilities/retrieval_qa.py +83 -0
  404. lfx/components/langchain_utilities/runnable_executor.py +137 -0
  405. lfx/components/langchain_utilities/self_query.py +80 -0
  406. lfx/components/langchain_utilities/spider.py +142 -0
  407. lfx/components/langchain_utilities/sql.py +40 -0
  408. lfx/components/langchain_utilities/sql_database.py +35 -0
  409. lfx/components/langchain_utilities/sql_generator.py +78 -0
  410. lfx/components/langchain_utilities/tool_calling.py +59 -0
  411. lfx/components/langchain_utilities/vector_store_info.py +49 -0
  412. lfx/components/langchain_utilities/vector_store_router.py +33 -0
  413. lfx/components/langchain_utilities/xml_agent.py +71 -0
  414. lfx/components/langwatch/__init__.py +3 -0
  415. lfx/components/langwatch/langwatch.py +278 -0
  416. lfx/components/link_extractors/__init__.py +3 -0
  417. lfx/components/llm_operations/__init__.py +46 -0
  418. lfx/components/llm_operations/batch_run.py +205 -0
  419. lfx/components/llm_operations/lambda_filter.py +218 -0
  420. lfx/components/llm_operations/llm_conditional_router.py +421 -0
  421. lfx/components/llm_operations/llm_selector.py +499 -0
  422. lfx/components/llm_operations/structured_output.py +244 -0
  423. lfx/components/lmstudio/__init__.py +34 -0
  424. lfx/components/lmstudio/lmstudioembeddings.py +89 -0
  425. lfx/components/lmstudio/lmstudiomodel.py +133 -0
  426. lfx/components/logic/__init__.py +181 -0
  427. lfx/components/maritalk/__init__.py +32 -0
  428. lfx/components/maritalk/maritalk.py +52 -0
  429. lfx/components/mem0/__init__.py +3 -0
  430. lfx/components/mem0/mem0_chat_memory.py +147 -0
  431. lfx/components/milvus/__init__.py +34 -0
  432. lfx/components/milvus/milvus.py +115 -0
  433. lfx/components/mistral/__init__.py +37 -0
  434. lfx/components/mistral/mistral.py +114 -0
  435. lfx/components/mistral/mistral_embeddings.py +58 -0
  436. lfx/components/models/__init__.py +89 -0
  437. lfx/components/models_and_agents/__init__.py +49 -0
  438. lfx/components/models_and_agents/agent.py +644 -0
  439. lfx/components/models_and_agents/embedding_model.py +423 -0
  440. lfx/components/models_and_agents/language_model.py +398 -0
  441. lfx/components/models_and_agents/mcp_component.py +594 -0
  442. lfx/components/models_and_agents/memory.py +268 -0
  443. lfx/components/models_and_agents/prompt.py +67 -0
  444. lfx/components/mongodb/__init__.py +34 -0
  445. lfx/components/mongodb/mongodb_atlas.py +213 -0
  446. lfx/components/needle/__init__.py +3 -0
  447. lfx/components/needle/needle.py +104 -0
  448. lfx/components/notdiamond/__init__.py +34 -0
  449. lfx/components/notdiamond/notdiamond.py +228 -0
  450. lfx/components/novita/__init__.py +32 -0
  451. lfx/components/novita/novita.py +130 -0
  452. lfx/components/nvidia/__init__.py +57 -0
  453. lfx/components/nvidia/nvidia.py +151 -0
  454. lfx/components/nvidia/nvidia_embedding.py +77 -0
  455. lfx/components/nvidia/nvidia_ingest.py +317 -0
  456. lfx/components/nvidia/nvidia_rerank.py +63 -0
  457. lfx/components/nvidia/system_assist.py +65 -0
  458. lfx/components/olivya/__init__.py +3 -0
  459. lfx/components/olivya/olivya.py +116 -0
  460. lfx/components/ollama/__init__.py +37 -0
  461. lfx/components/ollama/ollama.py +548 -0
  462. lfx/components/ollama/ollama_embeddings.py +103 -0
  463. lfx/components/openai/__init__.py +37 -0
  464. lfx/components/openai/openai.py +100 -0
  465. lfx/components/openai/openai_chat_model.py +176 -0
  466. lfx/components/openrouter/__init__.py +32 -0
  467. lfx/components/openrouter/openrouter.py +104 -0
  468. lfx/components/output_parsers/__init__.py +3 -0
  469. lfx/components/perplexity/__init__.py +34 -0
  470. lfx/components/perplexity/perplexity.py +75 -0
  471. lfx/components/pgvector/__init__.py +34 -0
  472. lfx/components/pgvector/pgvector.py +72 -0
  473. lfx/components/pinecone/__init__.py +34 -0
  474. lfx/components/pinecone/pinecone.py +134 -0
  475. lfx/components/processing/__init__.py +72 -0
  476. lfx/components/processing/alter_metadata.py +109 -0
  477. lfx/components/processing/combine_text.py +40 -0
  478. lfx/components/processing/converter.py +248 -0
  479. lfx/components/processing/create_data.py +111 -0
  480. lfx/components/processing/create_list.py +40 -0
  481. lfx/components/processing/data_operations.py +528 -0
  482. lfx/components/processing/data_to_dataframe.py +71 -0
  483. lfx/components/processing/dataframe_operations.py +313 -0
  484. lfx/components/processing/dataframe_to_toolset.py +259 -0
  485. lfx/components/processing/dynamic_create_data.py +357 -0
  486. lfx/components/processing/extract_key.py +54 -0
  487. lfx/components/processing/filter_data.py +43 -0
  488. lfx/components/processing/filter_data_values.py +89 -0
  489. lfx/components/processing/json_cleaner.py +104 -0
  490. lfx/components/processing/merge_data.py +91 -0
  491. lfx/components/processing/message_to_data.py +37 -0
  492. lfx/components/processing/output_parser.py +46 -0
  493. lfx/components/processing/parse_data.py +71 -0
  494. lfx/components/processing/parse_dataframe.py +69 -0
  495. lfx/components/processing/parse_json_data.py +91 -0
  496. lfx/components/processing/parser.py +148 -0
  497. lfx/components/processing/regex.py +83 -0
  498. lfx/components/processing/select_data.py +49 -0
  499. lfx/components/processing/split_text.py +141 -0
  500. lfx/components/processing/store_message.py +91 -0
  501. lfx/components/processing/update_data.py +161 -0
  502. lfx/components/prototypes/__init__.py +35 -0
  503. lfx/components/prototypes/python_function.py +73 -0
  504. lfx/components/qdrant/__init__.py +34 -0
  505. lfx/components/qdrant/qdrant.py +109 -0
  506. lfx/components/redis/__init__.py +37 -0
  507. lfx/components/redis/redis.py +89 -0
  508. lfx/components/redis/redis_chat.py +43 -0
  509. lfx/components/sambanova/__init__.py +32 -0
  510. lfx/components/sambanova/sambanova.py +84 -0
  511. lfx/components/scrapegraph/__init__.py +40 -0
  512. lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
  513. lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
  514. lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
  515. lfx/components/searchapi/__init__.py +34 -0
  516. lfx/components/searchapi/search.py +79 -0
  517. lfx/components/serpapi/__init__.py +3 -0
  518. lfx/components/serpapi/serp.py +115 -0
  519. lfx/components/supabase/__init__.py +34 -0
  520. lfx/components/supabase/supabase.py +76 -0
  521. lfx/components/tavily/__init__.py +4 -0
  522. lfx/components/tavily/tavily_extract.py +117 -0
  523. lfx/components/tavily/tavily_search.py +212 -0
  524. lfx/components/textsplitters/__init__.py +3 -0
  525. lfx/components/toolkits/__init__.py +3 -0
  526. lfx/components/tools/__init__.py +66 -0
  527. lfx/components/tools/calculator.py +109 -0
  528. lfx/components/tools/google_search_api.py +45 -0
  529. lfx/components/tools/google_serper_api.py +115 -0
  530. lfx/components/tools/python_code_structured_tool.py +328 -0
  531. lfx/components/tools/python_repl.py +98 -0
  532. lfx/components/tools/search_api.py +88 -0
  533. lfx/components/tools/searxng.py +145 -0
  534. lfx/components/tools/serp_api.py +120 -0
  535. lfx/components/tools/tavily_search_tool.py +345 -0
  536. lfx/components/tools/wikidata_api.py +103 -0
  537. lfx/components/tools/wikipedia_api.py +50 -0
  538. lfx/components/tools/yahoo_finance.py +130 -0
  539. lfx/components/twelvelabs/__init__.py +52 -0
  540. lfx/components/twelvelabs/convert_astra_results.py +84 -0
  541. lfx/components/twelvelabs/pegasus_index.py +311 -0
  542. lfx/components/twelvelabs/split_video.py +301 -0
  543. lfx/components/twelvelabs/text_embeddings.py +57 -0
  544. lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
  545. lfx/components/twelvelabs/video_embeddings.py +100 -0
  546. lfx/components/twelvelabs/video_file.py +191 -0
  547. lfx/components/unstructured/__init__.py +3 -0
  548. lfx/components/unstructured/unstructured.py +121 -0
  549. lfx/components/upstash/__init__.py +34 -0
  550. lfx/components/upstash/upstash.py +124 -0
  551. lfx/components/utilities/__init__.py +43 -0
  552. lfx/components/utilities/calculator_core.py +89 -0
  553. lfx/components/utilities/current_date.py +42 -0
  554. lfx/components/utilities/id_generator.py +42 -0
  555. lfx/components/utilities/python_repl_core.py +98 -0
  556. lfx/components/vectara/__init__.py +37 -0
  557. lfx/components/vectara/vectara.py +97 -0
  558. lfx/components/vectara/vectara_rag.py +164 -0
  559. lfx/components/vectorstores/__init__.py +34 -0
  560. lfx/components/vectorstores/local_db.py +270 -0
  561. lfx/components/vertexai/__init__.py +37 -0
  562. lfx/components/vertexai/vertexai.py +71 -0
  563. lfx/components/vertexai/vertexai_embeddings.py +67 -0
  564. lfx/components/vlmrun/__init__.py +34 -0
  565. lfx/components/vlmrun/vlmrun_transcription.py +224 -0
  566. lfx/components/weaviate/__init__.py +34 -0
  567. lfx/components/weaviate/weaviate.py +89 -0
  568. lfx/components/wikipedia/__init__.py +4 -0
  569. lfx/components/wikipedia/wikidata.py +86 -0
  570. lfx/components/wikipedia/wikipedia.py +53 -0
  571. lfx/components/wolframalpha/__init__.py +3 -0
  572. lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
  573. lfx/components/xai/__init__.py +32 -0
  574. lfx/components/xai/xai.py +167 -0
  575. lfx/components/yahoosearch/__init__.py +3 -0
  576. lfx/components/yahoosearch/yahoo.py +137 -0
  577. lfx/components/youtube/__init__.py +52 -0
  578. lfx/components/youtube/channel.py +227 -0
  579. lfx/components/youtube/comments.py +231 -0
  580. lfx/components/youtube/playlist.py +33 -0
  581. lfx/components/youtube/search.py +120 -0
  582. lfx/components/youtube/trending.py +285 -0
  583. lfx/components/youtube/video_details.py +263 -0
  584. lfx/components/youtube/youtube_transcripts.py +206 -0
  585. lfx/components/zep/__init__.py +3 -0
  586. lfx/components/zep/zep.py +45 -0
  587. lfx/constants.py +6 -0
  588. lfx/custom/__init__.py +7 -0
  589. lfx/custom/attributes.py +87 -0
  590. lfx/custom/code_parser/__init__.py +3 -0
  591. lfx/custom/code_parser/code_parser.py +361 -0
  592. lfx/custom/custom_component/__init__.py +0 -0
  593. lfx/custom/custom_component/base_component.py +128 -0
  594. lfx/custom/custom_component/component.py +1890 -0
  595. lfx/custom/custom_component/component_with_cache.py +8 -0
  596. lfx/custom/custom_component/custom_component.py +650 -0
  597. lfx/custom/dependency_analyzer.py +165 -0
  598. lfx/custom/directory_reader/__init__.py +3 -0
  599. lfx/custom/directory_reader/directory_reader.py +359 -0
  600. lfx/custom/directory_reader/utils.py +171 -0
  601. lfx/custom/eval.py +12 -0
  602. lfx/custom/schema.py +32 -0
  603. lfx/custom/tree_visitor.py +21 -0
  604. lfx/custom/utils.py +877 -0
  605. lfx/custom/validate.py +523 -0
  606. lfx/events/__init__.py +1 -0
  607. lfx/events/event_manager.py +110 -0
  608. lfx/exceptions/__init__.py +0 -0
  609. lfx/exceptions/component.py +15 -0
  610. lfx/field_typing/__init__.py +91 -0
  611. lfx/field_typing/constants.py +216 -0
  612. lfx/field_typing/range_spec.py +35 -0
  613. lfx/graph/__init__.py +6 -0
  614. lfx/graph/edge/__init__.py +0 -0
  615. lfx/graph/edge/base.py +300 -0
  616. lfx/graph/edge/schema.py +119 -0
  617. lfx/graph/edge/utils.py +0 -0
  618. lfx/graph/graph/__init__.py +0 -0
  619. lfx/graph/graph/ascii.py +202 -0
  620. lfx/graph/graph/base.py +2298 -0
  621. lfx/graph/graph/constants.py +63 -0
  622. lfx/graph/graph/runnable_vertices_manager.py +133 -0
  623. lfx/graph/graph/schema.py +53 -0
  624. lfx/graph/graph/state_model.py +66 -0
  625. lfx/graph/graph/utils.py +1024 -0
  626. lfx/graph/schema.py +75 -0
  627. lfx/graph/state/__init__.py +0 -0
  628. lfx/graph/state/model.py +250 -0
  629. lfx/graph/utils.py +206 -0
  630. lfx/graph/vertex/__init__.py +0 -0
  631. lfx/graph/vertex/base.py +826 -0
  632. lfx/graph/vertex/constants.py +0 -0
  633. lfx/graph/vertex/exceptions.py +4 -0
  634. lfx/graph/vertex/param_handler.py +316 -0
  635. lfx/graph/vertex/schema.py +26 -0
  636. lfx/graph/vertex/utils.py +19 -0
  637. lfx/graph/vertex/vertex_types.py +489 -0
  638. lfx/helpers/__init__.py +141 -0
  639. lfx/helpers/base_model.py +71 -0
  640. lfx/helpers/custom.py +13 -0
  641. lfx/helpers/data.py +167 -0
  642. lfx/helpers/flow.py +308 -0
  643. lfx/inputs/__init__.py +68 -0
  644. lfx/inputs/constants.py +2 -0
  645. lfx/inputs/input_mixin.py +352 -0
  646. lfx/inputs/inputs.py +718 -0
  647. lfx/inputs/validators.py +19 -0
  648. lfx/interface/__init__.py +6 -0
  649. lfx/interface/components.py +897 -0
  650. lfx/interface/importing/__init__.py +5 -0
  651. lfx/interface/importing/utils.py +39 -0
  652. lfx/interface/initialize/__init__.py +3 -0
  653. lfx/interface/initialize/loading.py +317 -0
  654. lfx/interface/listing.py +26 -0
  655. lfx/interface/run.py +16 -0
  656. lfx/interface/utils.py +111 -0
  657. lfx/io/__init__.py +63 -0
  658. lfx/io/schema.py +295 -0
  659. lfx/load/__init__.py +8 -0
  660. lfx/load/load.py +256 -0
  661. lfx/load/utils.py +99 -0
  662. lfx/log/__init__.py +5 -0
  663. lfx/log/logger.py +411 -0
  664. lfx/logging/__init__.py +11 -0
  665. lfx/logging/logger.py +24 -0
  666. lfx/memory/__init__.py +70 -0
  667. lfx/memory/stubs.py +302 -0
  668. lfx/processing/__init__.py +1 -0
  669. lfx/processing/process.py +238 -0
  670. lfx/processing/utils.py +25 -0
  671. lfx/py.typed +0 -0
  672. lfx/schema/__init__.py +66 -0
  673. lfx/schema/artifact.py +83 -0
  674. lfx/schema/content_block.py +62 -0
  675. lfx/schema/content_types.py +91 -0
  676. lfx/schema/cross_module.py +80 -0
  677. lfx/schema/data.py +309 -0
  678. lfx/schema/dataframe.py +210 -0
  679. lfx/schema/dotdict.py +74 -0
  680. lfx/schema/encoders.py +13 -0
  681. lfx/schema/graph.py +47 -0
  682. lfx/schema/image.py +184 -0
  683. lfx/schema/json_schema.py +186 -0
  684. lfx/schema/log.py +62 -0
  685. lfx/schema/message.py +493 -0
  686. lfx/schema/openai_responses_schemas.py +74 -0
  687. lfx/schema/properties.py +41 -0
  688. lfx/schema/schema.py +180 -0
  689. lfx/schema/serialize.py +13 -0
  690. lfx/schema/table.py +142 -0
  691. lfx/schema/validators.py +114 -0
  692. lfx/serialization/__init__.py +5 -0
  693. lfx/serialization/constants.py +2 -0
  694. lfx/serialization/serialization.py +314 -0
  695. lfx/services/__init__.py +26 -0
  696. lfx/services/base.py +28 -0
  697. lfx/services/cache/__init__.py +6 -0
  698. lfx/services/cache/base.py +183 -0
  699. lfx/services/cache/service.py +166 -0
  700. lfx/services/cache/utils.py +169 -0
  701. lfx/services/chat/__init__.py +1 -0
  702. lfx/services/chat/config.py +2 -0
  703. lfx/services/chat/schema.py +10 -0
  704. lfx/services/database/__init__.py +5 -0
  705. lfx/services/database/service.py +25 -0
  706. lfx/services/deps.py +194 -0
  707. lfx/services/factory.py +19 -0
  708. lfx/services/initialize.py +19 -0
  709. lfx/services/interfaces.py +103 -0
  710. lfx/services/manager.py +185 -0
  711. lfx/services/mcp_composer/__init__.py +6 -0
  712. lfx/services/mcp_composer/factory.py +16 -0
  713. lfx/services/mcp_composer/service.py +1441 -0
  714. lfx/services/schema.py +21 -0
  715. lfx/services/session.py +87 -0
  716. lfx/services/settings/__init__.py +3 -0
  717. lfx/services/settings/auth.py +133 -0
  718. lfx/services/settings/base.py +668 -0
  719. lfx/services/settings/constants.py +43 -0
  720. lfx/services/settings/factory.py +23 -0
  721. lfx/services/settings/feature_flags.py +11 -0
  722. lfx/services/settings/service.py +35 -0
  723. lfx/services/settings/utils.py +40 -0
  724. lfx/services/shared_component_cache/__init__.py +1 -0
  725. lfx/services/shared_component_cache/factory.py +30 -0
  726. lfx/services/shared_component_cache/service.py +9 -0
  727. lfx/services/storage/__init__.py +5 -0
  728. lfx/services/storage/local.py +185 -0
  729. lfx/services/storage/service.py +177 -0
  730. lfx/services/tracing/__init__.py +1 -0
  731. lfx/services/tracing/service.py +21 -0
  732. lfx/settings.py +6 -0
  733. lfx/template/__init__.py +6 -0
  734. lfx/template/field/__init__.py +0 -0
  735. lfx/template/field/base.py +260 -0
  736. lfx/template/field/prompt.py +15 -0
  737. lfx/template/frontend_node/__init__.py +6 -0
  738. lfx/template/frontend_node/base.py +214 -0
  739. lfx/template/frontend_node/constants.py +65 -0
  740. lfx/template/frontend_node/custom_components.py +79 -0
  741. lfx/template/template/__init__.py +0 -0
  742. lfx/template/template/base.py +100 -0
  743. lfx/template/utils.py +217 -0
  744. lfx/type_extraction/__init__.py +19 -0
  745. lfx/type_extraction/type_extraction.py +75 -0
  746. lfx/type_extraction.py +80 -0
  747. lfx/utils/__init__.py +1 -0
  748. lfx/utils/async_helpers.py +42 -0
  749. lfx/utils/component_utils.py +154 -0
  750. lfx/utils/concurrency.py +60 -0
  751. lfx/utils/connection_string_parser.py +11 -0
  752. lfx/utils/constants.py +233 -0
  753. lfx/utils/data_structure.py +212 -0
  754. lfx/utils/exceptions.py +22 -0
  755. lfx/utils/helpers.py +34 -0
  756. lfx/utils/image.py +79 -0
  757. lfx/utils/langflow_utils.py +52 -0
  758. lfx/utils/lazy_load.py +15 -0
  759. lfx/utils/request_utils.py +18 -0
  760. lfx/utils/schemas.py +139 -0
  761. lfx/utils/ssrf_protection.py +384 -0
  762. lfx/utils/util.py +626 -0
  763. lfx/utils/util_strings.py +56 -0
  764. lfx/utils/validate_cloud.py +26 -0
  765. lfx/utils/version.py +24 -0
  766. lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
  767. lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
  768. lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
  769. lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,109 @@
1
+ import ast
2
+ import operator
3
+
4
+ import pytest
5
+ from langchain_core.tools import ToolException
6
+ from pydantic import BaseModel, Field
7
+
8
+ from lfx.base.langchain_utilities.model import LCToolComponent
9
+ from lfx.field_typing import Tool
10
+ from lfx.inputs.inputs import MessageTextInput
11
+ from lfx.log.logger import logger
12
+ from lfx.schema.data import Data
13
+
14
+
15
+ class CalculatorToolComponent(LCToolComponent):
16
+ display_name = "Calculator"
17
+ description = "Perform basic arithmetic operations on a given expression."
18
+ icon = "calculator"
19
+ name = "CalculatorTool"
20
+ legacy = True
21
+ replacement = ["helpers.CalculatorComponent"]
22
+
23
+ inputs = [
24
+ MessageTextInput(
25
+ name="expression",
26
+ display_name="Expression",
27
+ info="The arithmetic expression to evaluate (e.g., '4*4*(33/22)+12-20').",
28
+ ),
29
+ ]
30
+
31
+ class CalculatorToolSchema(BaseModel):
32
+ expression: str = Field(..., description="The arithmetic expression to evaluate.")
33
+
34
+ def run_model(self) -> list[Data]:
35
+ return self._evaluate_expression(self.expression)
36
+
37
+ def build_tool(self) -> Tool:
38
+ try:
39
+ from langchain.tools import StructuredTool
40
+ except Exception: # noqa: BLE001
41
+ pytest.skip("langchain is not available")
42
+
43
+ return StructuredTool.from_function(
44
+ name="calculator",
45
+ description="Evaluate basic arithmetic expressions. Input should be a string containing the expression.",
46
+ func=self._eval_expr_with_error,
47
+ args_schema=self.CalculatorToolSchema,
48
+ )
49
+
50
+ def _eval_expr(self, node):
51
+ if isinstance(node, ast.Num):
52
+ return node.n
53
+ if isinstance(node, ast.BinOp):
54
+ left_val = self._eval_expr(node.left)
55
+ right_val = self._eval_expr(node.right)
56
+ return self.operators[type(node.op)](left_val, right_val)
57
+ if isinstance(node, ast.UnaryOp):
58
+ operand_val = self._eval_expr(node.operand)
59
+ return self.operators[type(node.op)](operand_val)
60
+ if isinstance(node, ast.Call):
61
+ msg = (
62
+ "Function calls like sqrt(), sin(), cos() etc. are not supported. "
63
+ "Only basic arithmetic operations (+, -, *, /, **) are allowed."
64
+ )
65
+ raise TypeError(msg)
66
+ msg = f"Unsupported operation or expression type: {type(node).__name__}"
67
+ raise TypeError(msg)
68
+
69
+ def _eval_expr_with_error(self, expression: str) -> list[Data]:
70
+ try:
71
+ return self._evaluate_expression(expression)
72
+ except Exception as e:
73
+ raise ToolException(str(e)) from e
74
+
75
+ def _evaluate_expression(self, expression: str) -> list[Data]:
76
+ try:
77
+ # Parse the expression and evaluate it
78
+ tree = ast.parse(expression, mode="eval")
79
+ result = self._eval_expr(tree.body)
80
+
81
+ # Format the result to a reasonable number of decimal places
82
+ formatted_result = f"{result:.6f}".rstrip("0").rstrip(".")
83
+
84
+ self.status = formatted_result
85
+ return [Data(data={"result": formatted_result})]
86
+
87
+ except (SyntaxError, TypeError, KeyError) as e:
88
+ error_message = f"Invalid expression: {e}"
89
+ self.status = error_message
90
+ return [Data(data={"error": error_message, "input": expression})]
91
+ except ZeroDivisionError:
92
+ error_message = "Error: Division by zero"
93
+ self.status = error_message
94
+ return [Data(data={"error": error_message, "input": expression})]
95
+ except Exception as e: # noqa: BLE001
96
+ logger.debug("Error evaluating expression", exc_info=True)
97
+ error_message = f"Error: {e}"
98
+ self.status = error_message
99
+ return [Data(data={"error": error_message, "input": expression})]
100
+
101
+ def __init__(self, *args, **kwargs):
102
+ super().__init__(*args, **kwargs)
103
+ self.operators = {
104
+ ast.Add: operator.add,
105
+ ast.Sub: operator.sub,
106
+ ast.Mult: operator.mul,
107
+ ast.Div: operator.truediv,
108
+ ast.Pow: operator.pow,
109
+ }
@@ -0,0 +1,45 @@
1
+ from langchain_core.tools import Tool
2
+
3
+ from lfx.base.langchain_utilities.model import LCToolComponent
4
+ from lfx.inputs.inputs import IntInput, MultilineInput, SecretStrInput
5
+ from lfx.schema.data import Data
6
+
7
+
8
+ class GoogleSearchAPIComponent(LCToolComponent):
9
+ display_name = "Google Search API [DEPRECATED]"
10
+ description = "Call Google Search API."
11
+ name = "GoogleSearchAPI"
12
+ icon = "Google"
13
+ legacy = True
14
+ inputs = [
15
+ SecretStrInput(name="google_api_key", display_name="Google API Key", required=True),
16
+ SecretStrInput(name="google_cse_id", display_name="Google CSE ID", required=True),
17
+ MultilineInput(
18
+ name="input_value",
19
+ display_name="Input",
20
+ ),
21
+ IntInput(name="k", display_name="Number of results", value=4, required=True),
22
+ ]
23
+
24
+ def run_model(self) -> Data | list[Data]:
25
+ wrapper = self._build_wrapper()
26
+ results = wrapper.results(query=self.input_value, num_results=self.k)
27
+ data = [Data(data=result, text=result["snippet"]) for result in results]
28
+ self.status = data
29
+ return data
30
+
31
+ def build_tool(self) -> Tool:
32
+ wrapper = self._build_wrapper()
33
+ return Tool(
34
+ name="google_search",
35
+ description="Search Google for recent results.",
36
+ func=wrapper.run,
37
+ )
38
+
39
+ def _build_wrapper(self):
40
+ try:
41
+ from langchain_google_community import GoogleSearchAPIWrapper
42
+ except ImportError as e:
43
+ msg = "Please install langchain-google-community to use GoogleSearchAPIWrapper."
44
+ raise ImportError(msg) from e
45
+ return GoogleSearchAPIWrapper(google_api_key=self.google_api_key, google_cse_id=self.google_cse_id, k=self.k)
@@ -0,0 +1,115 @@
1
+ from typing import Any
2
+
3
+ from langchain.tools import StructuredTool
4
+ from langchain_community.utilities.google_serper import GoogleSerperAPIWrapper
5
+ from pydantic import BaseModel, Field
6
+
7
+ from lfx.base.langchain_utilities.model import LCToolComponent
8
+ from lfx.field_typing import Tool
9
+ from lfx.inputs.inputs import (
10
+ DictInput,
11
+ DropdownInput,
12
+ IntInput,
13
+ MultilineInput,
14
+ SecretStrInput,
15
+ )
16
+ from lfx.schema.data import Data
17
+
18
+
19
+ class QuerySchema(BaseModel):
20
+ query: str = Field(..., description="The query to search for.")
21
+ query_type: str = Field(
22
+ "search",
23
+ description="The type of search to perform (e.g., 'news' or 'search').",
24
+ )
25
+ k: int = Field(4, description="The number of results to return.")
26
+ query_params: dict[str, Any] = Field({}, description="Additional query parameters to pass to the API.")
27
+
28
+
29
+ class GoogleSerperAPIComponent(LCToolComponent):
30
+ display_name = "Google Serper API [DEPRECATED]"
31
+ description = "Call the Serper.dev Google Search API."
32
+ name = "GoogleSerperAPI"
33
+ icon = "Google"
34
+ legacy = True
35
+ inputs = [
36
+ SecretStrInput(name="serper_api_key", display_name="Serper API Key", required=True),
37
+ MultilineInput(
38
+ name="query",
39
+ display_name="Query",
40
+ ),
41
+ IntInput(name="k", display_name="Number of results", value=4, required=True),
42
+ DropdownInput(
43
+ name="query_type",
44
+ display_name="Query Type",
45
+ required=False,
46
+ options=["news", "search"],
47
+ value="search",
48
+ ),
49
+ DictInput(
50
+ name="query_params",
51
+ display_name="Query Params",
52
+ required=False,
53
+ value={
54
+ "gl": "us",
55
+ "hl": "en",
56
+ },
57
+ list=True,
58
+ ),
59
+ ]
60
+
61
+ def run_model(self) -> Data | list[Data]:
62
+ wrapper = self._build_wrapper(self.k, self.query_type, self.query_params)
63
+ results = wrapper.results(query=self.query)
64
+
65
+ # Adjust the extraction based on the `type`
66
+ if self.query_type == "search":
67
+ list_results = results.get("organic", [])
68
+ elif self.query_type == "news":
69
+ list_results = results.get("news", [])
70
+ else:
71
+ list_results = []
72
+
73
+ data_list = []
74
+ for result in list_results:
75
+ result["text"] = result.pop("snippet", "")
76
+ data_list.append(Data(data=result))
77
+ self.status = data_list
78
+ return data_list
79
+
80
+ def build_tool(self) -> Tool:
81
+ return StructuredTool.from_function(
82
+ name="google_search",
83
+ description="Search Google for recent results.",
84
+ func=self._search,
85
+ args_schema=self.QuerySchema,
86
+ )
87
+
88
+ def _build_wrapper(
89
+ self,
90
+ k: int = 5,
91
+ query_type: str = "search",
92
+ query_params: dict | None = None,
93
+ ) -> GoogleSerperAPIWrapper:
94
+ wrapper_args = {
95
+ "serper_api_key": self.serper_api_key,
96
+ "k": k,
97
+ "type": query_type,
98
+ }
99
+
100
+ # Add query_params if provided
101
+ if query_params:
102
+ wrapper_args.update(query_params) # Merge with additional query params
103
+
104
+ # Dynamically pass parameters to the wrapper
105
+ return GoogleSerperAPIWrapper(**wrapper_args)
106
+
107
+ def _search(
108
+ self,
109
+ query: str,
110
+ k: int = 5,
111
+ query_type: str = "search",
112
+ query_params: dict | None = None,
113
+ ) -> dict:
114
+ wrapper = self._build_wrapper(k, query_type, query_params)
115
+ return wrapper.results(query=query)
@@ -0,0 +1,328 @@
1
+ import ast
2
+ import json
3
+ from typing import Any
4
+
5
+ from langchain.agents import Tool
6
+ from langchain_core.tools import StructuredTool
7
+ from pydantic.v1 import Field, create_model
8
+ from pydantic.v1.fields import Undefined
9
+ from typing_extensions import override
10
+
11
+ from lfx.base.langchain_utilities.model import LCToolComponent
12
+ from lfx.inputs.inputs import BoolInput, DropdownInput, FieldTypes, HandleInput, MessageTextInput, MultilineInput
13
+ from lfx.io import Output
14
+ from lfx.log.logger import logger
15
+ from lfx.schema.data import Data
16
+ from lfx.schema.dotdict import dotdict
17
+
18
+
19
+ class PythonCodeStructuredTool(LCToolComponent):
20
+ DEFAULT_KEYS = [
21
+ "code",
22
+ "_type",
23
+ "text_key",
24
+ "tool_code",
25
+ "tool_name",
26
+ "tool_description",
27
+ "return_direct",
28
+ "tool_function",
29
+ "global_variables",
30
+ "_classes",
31
+ "_functions",
32
+ ]
33
+ display_name = "Python Code Structured"
34
+ description = "structuredtool dataclass code to tool"
35
+ documentation = "https://python.langchain.com/docs/modules/tools/custom_tools/#structuredtool-dataclass"
36
+ name = "PythonCodeStructuredTool"
37
+ icon = "Python"
38
+ field_order = ["name", "description", "tool_code", "return_direct", "tool_function"]
39
+ legacy: bool = True
40
+ replacement = ["processing.PythonREPLComponent"]
41
+
42
+ inputs = [
43
+ MultilineInput(
44
+ name="tool_code",
45
+ display_name="Tool Code",
46
+ info="Enter the dataclass code.",
47
+ placeholder="def my_function(args):\n pass",
48
+ required=True,
49
+ real_time_refresh=True,
50
+ refresh_button=True,
51
+ ),
52
+ MessageTextInput(
53
+ name="tool_name",
54
+ display_name="Tool Name",
55
+ info="Enter the name of the tool.",
56
+ required=True,
57
+ ),
58
+ MessageTextInput(
59
+ name="tool_description",
60
+ display_name="Description",
61
+ info="Enter the description of the tool.",
62
+ required=True,
63
+ ),
64
+ BoolInput(
65
+ name="return_direct",
66
+ display_name="Return Directly",
67
+ info="Should the tool return the function output directly?",
68
+ ),
69
+ DropdownInput(
70
+ name="tool_function",
71
+ display_name="Tool Function",
72
+ info="Select the function for additional expressions.",
73
+ options=[],
74
+ required=True,
75
+ real_time_refresh=True,
76
+ refresh_button=True,
77
+ ),
78
+ HandleInput(
79
+ name="global_variables",
80
+ display_name="Global Variables",
81
+ info="Enter the global variables or Create Data Component.",
82
+ input_types=["Data"],
83
+ field_type=FieldTypes.DICT,
84
+ is_list=True,
85
+ ),
86
+ MessageTextInput(name="_classes", display_name="Classes", advanced=True),
87
+ MessageTextInput(name="_functions", display_name="Functions", advanced=True),
88
+ ]
89
+
90
+ outputs = [
91
+ Output(display_name="Tool", name="result_tool", method="build_tool"),
92
+ ]
93
+
94
+ @override
95
+ async def update_build_config(
96
+ self, build_config: dotdict, field_value: Any, field_name: str | None = None
97
+ ) -> dotdict:
98
+ if field_name is None:
99
+ return build_config
100
+
101
+ if field_name not in {"tool_code", "tool_function"}:
102
+ return build_config
103
+
104
+ try:
105
+ named_functions = {}
106
+ [classes, functions] = self._parse_code(build_config["tool_code"]["value"])
107
+ existing_fields = {}
108
+ if len(build_config) > len(self.DEFAULT_KEYS):
109
+ for key in build_config.copy():
110
+ if key not in self.DEFAULT_KEYS:
111
+ existing_fields[key] = build_config.pop(key)
112
+
113
+ names = []
114
+ for func in functions:
115
+ named_functions[func["name"]] = func
116
+ names.append(func["name"])
117
+
118
+ for arg in func["args"]:
119
+ field_name = f"{func['name']}|{arg['name']}"
120
+ if field_name in existing_fields:
121
+ build_config[field_name] = existing_fields[field_name]
122
+ continue
123
+
124
+ field = MessageTextInput(
125
+ display_name=f"{arg['name']}: Description",
126
+ name=field_name,
127
+ info=f"Enter the description for {arg['name']}",
128
+ required=True,
129
+ )
130
+ build_config[field_name] = field.to_dict()
131
+ build_config["_functions"]["value"] = json.dumps(named_functions)
132
+ build_config["_classes"]["value"] = json.dumps(classes)
133
+ build_config["tool_function"]["options"] = names
134
+ except Exception as e: # noqa: BLE001
135
+ self.status = f"Failed to extract names: {e}"
136
+ logger.debug(self.status, exc_info=True)
137
+ build_config["tool_function"]["options"] = ["Failed to parse", str(e)]
138
+ return build_config
139
+
140
+ async def build_tool(self) -> Tool:
141
+ local_namespace = {} # type: ignore[var-annotated]
142
+ modules = self._find_imports(self.tool_code)
143
+ import_code = ""
144
+ for module in modules["imports"]:
145
+ import_code += f"global {module}\nimport {module}\n"
146
+ for from_module in modules["from_imports"]:
147
+ for alias in from_module.names:
148
+ import_code += f"global {alias.name}\n"
149
+ import_code += (
150
+ f"from {from_module.module} import {', '.join([alias.name for alias in from_module.names])}\n"
151
+ )
152
+ exec(import_code, globals())
153
+ exec(self.tool_code, globals(), local_namespace)
154
+
155
+ class PythonCodeToolFunc:
156
+ params: dict = {}
157
+
158
+ def run(**kwargs):
159
+ for key, arg in kwargs.items():
160
+ if key not in PythonCodeToolFunc.params:
161
+ PythonCodeToolFunc.params[key] = arg
162
+ return local_namespace[self.tool_function](**PythonCodeToolFunc.params)
163
+
164
+ globals_ = globals()
165
+ local = {}
166
+ local[self.tool_function] = PythonCodeToolFunc
167
+ globals_.update(local)
168
+
169
+ if isinstance(self.global_variables, list):
170
+ for data in self.global_variables:
171
+ if isinstance(data, Data):
172
+ globals_.update(data.data)
173
+ elif isinstance(self.global_variables, dict):
174
+ globals_.update(self.global_variables)
175
+
176
+ classes = json.loads(self._attributes["_classes"])
177
+ for class_dict in classes:
178
+ exec("\n".join(class_dict["code"]), globals_)
179
+
180
+ named_functions = json.loads(self._attributes["_functions"])
181
+ schema_fields = {}
182
+
183
+ for attr in self._attributes:
184
+ if attr in self.DEFAULT_KEYS:
185
+ continue
186
+
187
+ func_name = attr.split("|")[0]
188
+ field_name = attr.split("|")[1]
189
+ func_arg = self._find_arg(named_functions, func_name, field_name)
190
+ if func_arg is None:
191
+ msg = f"Failed to find arg: {field_name}"
192
+ raise ValueError(msg)
193
+
194
+ field_annotation = func_arg["annotation"]
195
+ field_description = self._get_value(self._attributes[attr], str)
196
+
197
+ if field_annotation:
198
+ exec(f"temp_annotation_type = {field_annotation}", globals_)
199
+ schema_annotation = globals_["temp_annotation_type"]
200
+ else:
201
+ schema_annotation = Any
202
+ schema_fields[field_name] = (
203
+ schema_annotation,
204
+ Field(
205
+ default=func_arg.get("default", Undefined),
206
+ description=field_description,
207
+ ),
208
+ )
209
+
210
+ if "temp_annotation_type" in globals_:
211
+ globals_.pop("temp_annotation_type")
212
+
213
+ python_code_tool_schema = None
214
+ if schema_fields:
215
+ python_code_tool_schema = create_model("PythonCodeToolSchema", **schema_fields)
216
+
217
+ return StructuredTool.from_function(
218
+ func=local[self.tool_function].run,
219
+ args_schema=python_code_tool_schema,
220
+ name=self.tool_name,
221
+ description=self.tool_description,
222
+ return_direct=self.return_direct,
223
+ )
224
+
225
+ async def update_frontend_node(self, new_frontend_node: dict, current_frontend_node: dict):
226
+ """This function is called after the code validation is done."""
227
+ frontend_node = await super().update_frontend_node(new_frontend_node, current_frontend_node)
228
+ frontend_node["template"] = await self.update_build_config(
229
+ frontend_node["template"],
230
+ frontend_node["template"]["tool_code"]["value"],
231
+ "tool_code",
232
+ )
233
+ frontend_node = await super().update_frontend_node(new_frontend_node, current_frontend_node)
234
+ for key in frontend_node["template"]:
235
+ if key in self.DEFAULT_KEYS:
236
+ continue
237
+ frontend_node["template"] = await self.update_build_config(
238
+ frontend_node["template"], frontend_node["template"][key]["value"], key
239
+ )
240
+ frontend_node = await super().update_frontend_node(new_frontend_node, current_frontend_node)
241
+ return frontend_node
242
+
243
+ def _parse_code(self, code: str) -> tuple[list[dict], list[dict]]:
244
+ parsed_code = ast.parse(code)
245
+ lines = code.split("\n")
246
+ classes = []
247
+ functions = []
248
+ for node in parsed_code.body:
249
+ if isinstance(node, ast.ClassDef):
250
+ class_lines = lines[node.lineno - 1 : node.end_lineno]
251
+ class_lines[-1] = class_lines[-1][: node.end_col_offset]
252
+ class_lines[0] = class_lines[0][node.col_offset :]
253
+ classes.append(
254
+ {
255
+ "name": node.name,
256
+ "code": class_lines,
257
+ }
258
+ )
259
+ continue
260
+
261
+ if not isinstance(node, ast.FunctionDef):
262
+ continue
263
+
264
+ func = {"name": node.name, "args": []}
265
+ for arg in node.args.args:
266
+ if arg.lineno != arg.end_lineno:
267
+ msg = "Multiline arguments are not supported"
268
+ raise ValueError(msg)
269
+
270
+ func_arg = {
271
+ "name": arg.arg,
272
+ "annotation": None,
273
+ }
274
+
275
+ for default in node.args.defaults:
276
+ if (
277
+ arg.lineno > default.lineno
278
+ or arg.col_offset > default.col_offset
279
+ or (
280
+ arg.end_lineno is not None
281
+ and default.end_lineno is not None
282
+ and arg.end_lineno < default.end_lineno
283
+ )
284
+ or (
285
+ arg.end_col_offset is not None
286
+ and default.end_col_offset is not None
287
+ and arg.end_col_offset < default.end_col_offset
288
+ )
289
+ ):
290
+ continue
291
+
292
+ if isinstance(default, ast.Name):
293
+ func_arg["default"] = default.id
294
+ elif isinstance(default, ast.Constant):
295
+ func_arg["default"] = str(default.value) if default.value is not None else None
296
+
297
+ if arg.annotation:
298
+ annotation_line = lines[arg.annotation.lineno - 1]
299
+ annotation_line = annotation_line[: arg.annotation.end_col_offset]
300
+ annotation_line = annotation_line[arg.annotation.col_offset :]
301
+ func_arg["annotation"] = annotation_line
302
+ if isinstance(func_arg["annotation"], str) and func_arg["annotation"].count("=") > 0:
303
+ func_arg["annotation"] = "=".join(func_arg["annotation"].split("=")[:-1]).strip()
304
+ if isinstance(func["args"], list):
305
+ func["args"].append(func_arg)
306
+ functions.append(func)
307
+
308
+ return classes, functions
309
+
310
+ def _find_imports(self, code: str) -> dotdict:
311
+ imports: list[str] = []
312
+ from_imports = []
313
+ parsed_code = ast.parse(code)
314
+ for node in parsed_code.body:
315
+ if isinstance(node, ast.Import):
316
+ imports.extend(alias.name for alias in node.names)
317
+ elif isinstance(node, ast.ImportFrom):
318
+ from_imports.append(node)
319
+ return dotdict({"imports": imports, "from_imports": from_imports})
320
+
321
+ def _get_value(self, value: Any, annotation: Any) -> Any:
322
+ return value if isinstance(value, annotation) else value["value"]
323
+
324
+ def _find_arg(self, named_functions: dict, func_name: str, arg_name: str) -> dict | None:
325
+ for arg in named_functions[func_name]["args"]:
326
+ if arg["name"] == arg_name:
327
+ return arg
328
+ return None
@@ -0,0 +1,98 @@
1
+ import importlib
2
+
3
+ from langchain.tools import StructuredTool
4
+ from langchain_core.tools import ToolException
5
+ from langchain_experimental.utilities import PythonREPL
6
+ from pydantic import BaseModel, Field
7
+
8
+ from lfx.base.langchain_utilities.model import LCToolComponent
9
+ from lfx.field_typing import Tool
10
+ from lfx.inputs.inputs import StrInput
11
+ from lfx.log.logger import logger
12
+ from lfx.schema.data import Data
13
+
14
+
15
+ class PythonREPLToolComponent(LCToolComponent):
16
+ display_name = "Python REPL"
17
+ description = "A tool for running Python code in a REPL environment."
18
+ name = "PythonREPLTool"
19
+ icon = "Python"
20
+ legacy = True
21
+ replacement = ["processing.PythonREPLComponent"]
22
+
23
+ inputs = [
24
+ StrInput(
25
+ name="name",
26
+ display_name="Tool Name",
27
+ info="The name of the tool.",
28
+ value="python_repl",
29
+ ),
30
+ StrInput(
31
+ name="description",
32
+ display_name="Tool Description",
33
+ info="A description of the tool.",
34
+ value="A Python shell. Use this to execute python commands. "
35
+ "Input should be a valid python command. "
36
+ "If you want to see the output of a value, you should print it out with `print(...)`.",
37
+ ),
38
+ StrInput(
39
+ name="global_imports",
40
+ display_name="Global Imports",
41
+ info="A comma-separated list of modules to import globally, e.g. 'math,numpy'.",
42
+ value="math",
43
+ ),
44
+ StrInput(
45
+ name="code",
46
+ display_name="Python Code",
47
+ info="The Python code to execute.",
48
+ value="print('Hello, World!')",
49
+ ),
50
+ ]
51
+
52
+ class PythonREPLSchema(BaseModel):
53
+ code: str = Field(..., description="The Python code to execute.")
54
+
55
+ def get_globals(self, global_imports: str | list[str]) -> dict:
56
+ global_dict = {}
57
+ if isinstance(global_imports, str):
58
+ modules = [module.strip() for module in global_imports.split(",")]
59
+ elif isinstance(global_imports, list):
60
+ modules = global_imports
61
+ else:
62
+ msg = "global_imports must be either a string or a list"
63
+ raise TypeError(msg)
64
+
65
+ for module in modules:
66
+ try:
67
+ imported_module = importlib.import_module(module)
68
+ global_dict[imported_module.__name__] = imported_module
69
+ except ImportError as e:
70
+ msg = f"Could not import module {module}"
71
+ raise ImportError(msg) from e
72
+ return global_dict
73
+
74
+ def build_tool(self) -> Tool:
75
+ globals_ = self.get_globals(self.global_imports)
76
+ python_repl = PythonREPL(_globals=globals_)
77
+
78
+ def run_python_code(code: str) -> str:
79
+ try:
80
+ return python_repl.run(code)
81
+ except Exception as e:
82
+ logger.debug("Error running Python code", exc_info=True)
83
+ raise ToolException(str(e)) from e
84
+
85
+ tool = StructuredTool.from_function(
86
+ name=self.name,
87
+ description=self.description,
88
+ func=run_python_code,
89
+ args_schema=self.PythonREPLSchema,
90
+ )
91
+
92
+ self.status = f"Python REPL Tool created with global imports: {self.global_imports}"
93
+ return tool
94
+
95
+ def run_model(self) -> list[Data]:
96
+ tool = self.build_tool()
97
+ result = tool.run(self.code)
98
+ return [Data(data={"result": result})]