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,730 @@
1
+ import asyncio
2
+ import json
3
+ import traceback
4
+ import uuid
5
+ from collections.abc import AsyncIterator
6
+ from typing import TYPE_CHECKING, Any, cast
7
+
8
+ from langchain_core.agents import AgentFinish
9
+ from langchain_core.messages import AIMessage, HumanMessage
10
+ from langchain_core.tools import StructuredTool
11
+
12
+ from lfx.base.agents.agent import LCToolsAgentComponent
13
+ from lfx.base.models.model_input_constants import (
14
+ ALL_PROVIDER_FIELDS,
15
+ MODEL_DYNAMIC_UPDATE_FIELDS,
16
+ MODEL_PROVIDERS,
17
+ MODEL_PROVIDERS_DICT,
18
+ MODELS_METADATA,
19
+ )
20
+ from lfx.base.models.model_utils import get_model_name
21
+ from lfx.components.helpers import CurrentDateComponent
22
+ from lfx.components.langchain_utilities.tool_calling import ToolCallingAgentComponent
23
+ from lfx.components.models_and_agents.memory import MemoryComponent
24
+ from lfx.custom.custom_component.component import _get_component_toolkit
25
+ from lfx.custom.utils import update_component_build_config
26
+ from lfx.field_typing import Tool
27
+ from lfx.io import BoolInput, DropdownInput, IntInput, MultilineInput, Output
28
+ from lfx.log.logger import logger
29
+ from lfx.schema.dotdict import dotdict
30
+ from lfx.schema.message import Message
31
+
32
+ if TYPE_CHECKING:
33
+ from lfx.schema.log import SendMessageFunctionType
34
+
35
+
36
+ def set_advanced_true(component_input):
37
+ """Set the advanced flag to True for a component input.
38
+
39
+ Args:
40
+ component_input: The component input to modify
41
+
42
+ Returns:
43
+ The modified component input with advanced=True
44
+ """
45
+ component_input.advanced = True
46
+ return component_input
47
+
48
+
49
+ MODEL_PROVIDERS_LIST = ["OpenAI"]
50
+
51
+
52
+ class CugaComponent(ToolCallingAgentComponent):
53
+ """Cuga Agent Component for advanced AI task execution.
54
+
55
+ The Cuga component is an advanced AI agent that can execute complex tasks using
56
+ various tools and browser automation. It supports custom policies, web applications,
57
+ and API interactions.
58
+
59
+ Attributes:
60
+ display_name: Human-readable name for the component
61
+ description: Brief description of the component's purpose
62
+ documentation: URL to component documentation
63
+ icon: Icon identifier for the UI
64
+ name: Internal component name
65
+ """
66
+
67
+ display_name: str = "Cuga"
68
+ description: str = "Define the Cuga agent's policies, then assign it a task."
69
+ documentation: str = "https://docs.langflow.org/bundles-cuga"
70
+ icon = "bot"
71
+ name = "Cuga"
72
+
73
+ memory_inputs = [set_advanced_true(component_input) for component_input in MemoryComponent().inputs]
74
+
75
+ inputs = [
76
+ DropdownInput(
77
+ name="agent_llm",
78
+ display_name="Model Provider",
79
+ info="The provider of the language model that the agent will use to generate responses.",
80
+ options=[*MODEL_PROVIDERS_LIST, "Custom"],
81
+ value="OpenAI",
82
+ real_time_refresh=True,
83
+ input_types=[],
84
+ options_metadata=[MODELS_METADATA[key] for key in MODEL_PROVIDERS_LIST] + [{"icon": "brain"}],
85
+ ),
86
+ *MODEL_PROVIDERS_DICT["OpenAI"]["inputs"],
87
+ MultilineInput(
88
+ name="policies",
89
+ display_name="Policies",
90
+ info=(
91
+ "Custom instructions or policies for the agent to adhere to during its operation.\n"
92
+ "Example:\n"
93
+ "## Plan\n"
94
+ "< planning instructions e.g. which tools and when to use>\n"
95
+ "## Answer\n"
96
+ "< final answer instructions how to answer>"
97
+ ),
98
+ value="",
99
+ advanced=False,
100
+ ),
101
+ IntInput(
102
+ name="n_messages",
103
+ display_name="Number of Chat History Messages",
104
+ value=100,
105
+ info="Number of chat history messages to retrieve.",
106
+ advanced=True,
107
+ show=True,
108
+ ),
109
+ *LCToolsAgentComponent.get_base_inputs(),
110
+ BoolInput(
111
+ name="add_current_date_tool",
112
+ display_name="Current Date",
113
+ advanced=True,
114
+ info="If true, will add a tool to the agent that returns the current date.",
115
+ value=True,
116
+ ),
117
+ BoolInput(
118
+ name="lite_mode",
119
+ display_name="Enable CugaLite",
120
+ info="Enable CugaLite for simple API tasks (faster execution).",
121
+ value=True,
122
+ advanced=False,
123
+ ),
124
+ IntInput(
125
+ name="lite_mode_tool_threshold",
126
+ display_name="CugaLite Tool Threshold",
127
+ info="Route to CugaLite if app has fewer than this many tools.",
128
+ value=25,
129
+ advanced=False,
130
+ ),
131
+ DropdownInput(
132
+ name="decomposition_strategy",
133
+ display_name="Decomposition Strategy",
134
+ info="Strategy for task decomposition: 'flexible' allows multiple subtasks per app,\n"
135
+ " 'exact' enforces one subtask per app.",
136
+ options=["flexible", "exact"],
137
+ value="flexible",
138
+ advanced=True,
139
+ ),
140
+ BoolInput(
141
+ name="browser_enabled",
142
+ display_name="Enable Browser",
143
+ info="Toggle to enable a built-in browser tool for web scraping and searching.",
144
+ value=False,
145
+ advanced=False,
146
+ ),
147
+ MultilineInput(
148
+ name="web_apps",
149
+ display_name="Web applications",
150
+ info=(
151
+ "Define a list of web applications that cuga will open when enable browser is true. "
152
+ "Currently only supports one web application. Example: https://example.com"
153
+ ),
154
+ value="",
155
+ advanced=False,
156
+ ),
157
+ ]
158
+ outputs = [
159
+ Output(name="response", display_name="Response", method="message_response"),
160
+ ]
161
+
162
+ async def call_agent(
163
+ self, current_input: str, tools: list[Tool], history_messages: list[Message], llm
164
+ ) -> AsyncIterator[dict[str, Any]]:
165
+ """Execute the Cuga agent with the given input and tools.
166
+
167
+ This method initializes and runs the Cuga agent, processing the input through
168
+ the agent's workflow and yielding events for real-time monitoring.
169
+
170
+ Args:
171
+ current_input: The user input to process
172
+ tools: List of available tools for the agent
173
+ history_messages: Previous conversation history
174
+ llm: The language model instance to use
175
+
176
+ Yields:
177
+ dict: Agent events including tool usage, thinking, and final results
178
+
179
+ Raises:
180
+ ValueError: If there's an error in agent initialization
181
+ TypeError: If there's a type error in processing
182
+ RuntimeError: If there's a runtime error during execution
183
+ ConnectionError: If there's a connection issue
184
+ """
185
+ yield {
186
+ "event": "on_chain_start",
187
+ "run_id": str(uuid.uuid4()),
188
+ "name": "CUGA_initializing",
189
+ "data": {"input": {"input": current_input, "chat_history": []}},
190
+ }
191
+ logger.debug(f"[CUGA] LLM MODEL TYPE: {type(llm)}")
192
+ if current_input:
193
+ # Import settings first
194
+ from cuga.config import settings
195
+
196
+ # Use Dynaconf's set() method to update settings dynamically
197
+ # This properly updates the settings object without corruption
198
+ logger.debug("[CUGA] Updating CUGA settings via Dynaconf set() method")
199
+
200
+ settings.advanced_features.registry = False
201
+ settings.advanced_features.lite_mode = self.lite_mode
202
+ settings.advanced_features.lite_mode_tool_threshold = self.lite_mode_tool_threshold
203
+ settings.advanced_features.decomposition_strategy = self.decomposition_strategy
204
+
205
+ if self.browser_enabled:
206
+ logger.debug("[CUGA] browser_enabled is true, setting mode to hybrid")
207
+ settings.advanced_features.mode = "hybrid"
208
+ settings.advanced_features.use_vision = False
209
+ else:
210
+ logger.debug("[CUGA] browser_enabled is false, setting mode to api")
211
+ settings.advanced_features.mode = "api"
212
+
213
+ from cuga.backend.activity_tracker.tracker import ActivityTracker
214
+ from cuga.backend.cuga_graph.nodes.api.variables_manager.manager import VariablesManager
215
+ from cuga.backend.cuga_graph.utils.agent_loop import StreamEvent
216
+ from cuga.backend.cuga_graph.utils.controller import (
217
+ AgentRunner as CugaAgent,
218
+ )
219
+ from cuga.backend.cuga_graph.utils.controller import (
220
+ ExperimentResult as AgentResult,
221
+ )
222
+ from cuga.backend.llm.models import LLMManager
223
+ from cuga.configurations.instructions_manager import InstructionsManager
224
+
225
+ var_manager = VariablesManager()
226
+
227
+ # Reset var_manager if this is the first message in history
228
+ logger.debug(f"[CUGA] Checking history_messages: count={len(history_messages) if history_messages else 0}")
229
+ if not history_messages or len(history_messages) == 0:
230
+ logger.debug("[CUGA] First message in history detected, resetting var_manager")
231
+ var_manager.reset()
232
+ else:
233
+ logger.debug(f"[CUGA] Continuing conversation with {len(history_messages)} previous messages")
234
+
235
+ llm_manager = LLMManager()
236
+ llm_manager.set_llm(llm)
237
+ instructions_manager = InstructionsManager()
238
+
239
+ policies_to_use = self.policies or ""
240
+ logger.debug(f"[CUGA] policies are: {policies_to_use}")
241
+ instructions_manager.set_instructions_from_one_file(policies_to_use)
242
+ tracker = ActivityTracker()
243
+ tracker.set_tools(tools)
244
+ cuga_agent = CugaAgent(browser_enabled=self.browser_enabled)
245
+ if self.browser_enabled:
246
+ await cuga_agent.initialize_freemode_env(start_url=self.web_apps.strip(), interface_mode="browser_only")
247
+ else:
248
+ await cuga_agent.initialize_appworld_env()
249
+
250
+ yield {
251
+ "event": "on_chain_start",
252
+ "run_id": str(uuid.uuid4()),
253
+ "name": "CUGA_thinking...",
254
+ "data": {"input": {"input": current_input, "chat_history": []}},
255
+ }
256
+ logger.debug(f"[CUGA] current web apps are {self.web_apps}")
257
+ logger.debug(f"[CUGA] Processing input: {current_input}")
258
+ try:
259
+ # Convert history to LangChain format for the event
260
+ lc_messages = []
261
+ for msg in history_messages:
262
+ if hasattr(msg, "sender") and msg.sender == "Human":
263
+ lc_messages.append(HumanMessage(content=msg.text))
264
+ else:
265
+ lc_messages.append(AIMessage(content=msg.text))
266
+
267
+ await asyncio.sleep(0.5)
268
+
269
+ # 2. Build final response
270
+ response_parts = []
271
+
272
+ response_parts.append(f"Processed input: '{current_input}'")
273
+ response_parts.append(f"Available tools: {len(tools)}")
274
+ last_event: StreamEvent | None = None
275
+ tool_run_id: str | None = None
276
+ # 3. Chain end event with AgentFinish
277
+ async for event in cuga_agent.run_task_generic_yield(eval_mode=False, goal=current_input):
278
+ logger.debug(f"[CUGA] recieved event {event}")
279
+ if last_event is not None and tool_run_id is not None:
280
+ logger.debug(f"[CUGA] last event {last_event}")
281
+ try:
282
+ # TODO: Extract data
283
+ data_dict = json.loads(last_event.data)
284
+ except json.JSONDecodeError:
285
+ data_dict = last_event.data
286
+ if last_event.name == "CodeAgent":
287
+ data_dict = data_dict["code"]
288
+ yield {
289
+ "event": "on_tool_end",
290
+ "run_id": tool_run_id,
291
+ "name": last_event.name,
292
+ "data": {"output": data_dict},
293
+ }
294
+ if isinstance(event, StreamEvent):
295
+ tool_run_id = str(uuid.uuid4())
296
+ last_event = StreamEvent(name=event.name, data=event.data)
297
+ tool_event = {
298
+ "event": "on_tool_start",
299
+ "run_id": tool_run_id,
300
+ "name": event.name,
301
+ "data": {"input": {}},
302
+ }
303
+ logger.debug(f"[CUGA] Yielding tool_start event: {event.name}")
304
+ yield tool_event
305
+
306
+ if isinstance(event, AgentResult):
307
+ task_result = event
308
+ end_event = {
309
+ "event": "on_chain_end",
310
+ "run_id": str(uuid.uuid4()),
311
+ "name": "CugaAgent",
312
+ "data": {"output": AgentFinish(return_values={"output": task_result.answer}, log="")},
313
+ }
314
+ answer_preview = task_result.answer[:100] if task_result.answer else "None"
315
+ logger.info(f"[CUGA] Yielding chain_end event with answer: {answer_preview}...")
316
+ yield end_event
317
+
318
+ except (ValueError, TypeError, RuntimeError, ConnectionError) as e:
319
+ logger.error(f"[CUGA] An error occurred: {e!s}")
320
+ logger.error(f"[CUGA] Traceback: {traceback.format_exc()}")
321
+ error_msg = f"CUGA Agent error: {e!s}"
322
+ logger.error(f"[CUGA] Error occurred: {error_msg}")
323
+
324
+ # Emit error event
325
+ yield {
326
+ "event": "on_chain_error",
327
+ "run_id": str(uuid.uuid4()),
328
+ "name": "CugaAgent",
329
+ "data": {"error": error_msg},
330
+ }
331
+
332
+ async def message_response(self) -> Message:
333
+ """Generate a message response using the Cuga agent.
334
+
335
+ This method processes the input through the Cuga agent and returns a structured
336
+ message response. It handles agent initialization, tool setup, and event processing.
337
+
338
+ Returns:
339
+ Message: The agent's response message
340
+
341
+ Raises:
342
+ Exception: If there's an error during agent execution
343
+ """
344
+ logger.debug("[CUGA] Starting Cuga agent run for message_response.")
345
+ logger.debug(f"[CUGA] Agent input value: {self.input_value}")
346
+
347
+ # Validate input is not empty
348
+ if not self.input_value or not str(self.input_value).strip():
349
+ msg = "Message cannot be empty. Please provide a valid message."
350
+ raise ValueError(msg)
351
+
352
+ try:
353
+ llm_model, self.chat_history, self.tools = await self.get_agent_requirements()
354
+
355
+ # Create agent message for event processing
356
+ from lfx.schema.content_block import ContentBlock
357
+ from lfx.schema.message import MESSAGE_SENDER_AI
358
+
359
+ agent_message = Message(
360
+ sender=MESSAGE_SENDER_AI,
361
+ sender_name="Cuga",
362
+ properties={"icon": "Bot", "state": "partial"},
363
+ content_blocks=[ContentBlock(title="Agent Steps", contents=[])],
364
+ session_id=self.graph.session_id,
365
+ )
366
+
367
+ # Pre-assign an ID for event processing, following the base agent pattern
368
+ # This ensures streaming works even when not connected to ChatOutput
369
+ if not self.is_connected_to_chat_output():
370
+ # When not connected to ChatOutput, assign ID upfront for streaming support
371
+ agent_message.data["id"] = str(uuid.uuid4())
372
+
373
+ # Get input text
374
+ input_text = self.input_value.text if hasattr(self.input_value, "text") else str(self.input_value)
375
+
376
+ # Create event iterator from call_agent
377
+ event_iterator = self.call_agent(
378
+ current_input=input_text, tools=self.tools or [], history_messages=self.chat_history, llm=llm_model
379
+ )
380
+
381
+ # Process events using the existing event processing system
382
+ from lfx.base.agents.events import process_agent_events
383
+
384
+ # Create a wrapper that forces DB updates for event handlers
385
+ # This ensures the UI can see loading steps in real-time via polling
386
+ async def force_db_update_send_message(message, id_=None, *, skip_db_update=False): # noqa: ARG001
387
+ # Always persist to DB so polling-based UI shows loading steps in real-time
388
+ content_blocks_len = len(message.content_blocks[0].contents) if message.content_blocks else 0
389
+ logger.debug(
390
+ f"[CUGA] Sending message update - state: {message.properties.state}, "
391
+ f"content_blocks: {content_blocks_len}"
392
+ )
393
+
394
+ result = await self.send_message(message, id_=id_, skip_db_update=False)
395
+
396
+ logger.debug(f"[CUGA] Message processed with ID: {result.id}")
397
+ return result
398
+
399
+ result = await process_agent_events(
400
+ event_iterator, agent_message, cast("SendMessageFunctionType", force_db_update_send_message)
401
+ )
402
+
403
+ logger.debug("[CUGA] Agent run finished successfully.")
404
+ logger.debug(f"[CUGA] Agent output: {result}")
405
+
406
+ except Exception as e:
407
+ logger.error(f"[CUGA] Error in message_response: {e}")
408
+ logger.error(f"[CUGA] An error occurred: {e!s}")
409
+ logger.error(f"[CUGA] Traceback: {traceback.format_exc()}")
410
+
411
+ # Check if error is related to Playwright installation
412
+ error_str = str(e).lower()
413
+ if "playwright install" in error_str:
414
+ msg = (
415
+ "Playwright is not installed. Please install Playwright Chromium using: "
416
+ "uv run -m playwright install chromium"
417
+ )
418
+ raise ValueError(msg) from e
419
+
420
+ raise
421
+ else:
422
+ return result
423
+
424
+ async def get_agent_requirements(self):
425
+ """Get the agent requirements for the Cuga agent.
426
+
427
+ This method retrieves and configures all necessary components for the agent
428
+ including the language model, chat history, and tools.
429
+
430
+ Returns:
431
+ tuple: A tuple containing (llm_model, chat_history, tools)
432
+
433
+ Raises:
434
+ ValueError: If no language model is selected or if there's an error
435
+ in model initialization
436
+ """
437
+ llm_model, display_name = await self.get_llm()
438
+ if llm_model is None:
439
+ msg = "No language model selected. Please choose a model to proceed."
440
+ raise ValueError(msg)
441
+ self.model_name = get_model_name(llm_model, display_name=display_name)
442
+
443
+ # Get memory data
444
+ self.chat_history = await self.get_memory_data()
445
+ if isinstance(self.chat_history, Message):
446
+ self.chat_history = [self.chat_history]
447
+
448
+ # Add current date tool if enabled
449
+ if self.add_current_date_tool:
450
+ if not isinstance(self.tools, list):
451
+ self.tools = []
452
+ current_date_tool = (await CurrentDateComponent(**self.get_base_args()).to_toolkit()).pop(0)
453
+ if not isinstance(current_date_tool, StructuredTool):
454
+ msg = "CurrentDateComponent must be converted to a StructuredTool"
455
+ raise TypeError(msg)
456
+ self.tools.append(current_date_tool)
457
+
458
+ # --- ADDED LOGGING START ---
459
+ logger.debug("[CUGA] Retrieved agent requirements: LLM, chat history, and tools.")
460
+ logger.debug(f"[CUGA] LLM model: {self.model_name}")
461
+ logger.debug(f"[CUGA] Number of chat history messages: {len(self.chat_history)}")
462
+ logger.debug(f"[CUGA] Tools available: {[tool.name for tool in self.tools]}")
463
+ logger.debug(f"[CUGA] metadata: {[tool.metadata for tool in self.tools]}")
464
+ # --- ADDED LOGGING END ---
465
+
466
+ return llm_model, self.chat_history, self.tools
467
+
468
+ async def get_memory_data(self):
469
+ """Retrieve chat history messages.
470
+
471
+ This method fetches the conversation history from memory, excluding the current
472
+ input message to avoid duplication.
473
+
474
+ Returns:
475
+ list: List of Message objects representing the chat history
476
+ """
477
+ logger.debug("[CUGA] Retrieving chat history messages.")
478
+ logger.debug(f"[CUGA] Session ID: {self.graph.session_id}")
479
+ messages = (
480
+ await MemoryComponent(**self.get_base_args())
481
+ .set(session_id=self.graph.session_id, order="Ascending", n_messages=self.n_messages)
482
+ .retrieve_messages()
483
+ )
484
+ logger.debug(f"[CUGA] Retrieved {len(messages)} messages from memory")
485
+ return [
486
+ message for message in messages if getattr(message, "id", None) != getattr(self.input_value, "id", None)
487
+ ]
488
+
489
+ async def get_llm(self):
490
+ """Get language model for the Cuga agent.
491
+
492
+ This method initializes and configures the language model based on the
493
+ selected provider and parameters.
494
+
495
+ Returns:
496
+ tuple: A tuple containing (llm_model, display_name)
497
+
498
+ Raises:
499
+ ValueError: If the model provider is invalid or model initialization fails
500
+ """
501
+ logger.debug("[CUGA] Getting language model for the agent.")
502
+ logger.debug(f"[CUGA] Requested LLM provider: {self.agent_llm}")
503
+
504
+ if not isinstance(self.agent_llm, str):
505
+ logger.debug("[CUGA] Agent LLM is already a model instance.")
506
+ return self.agent_llm, None
507
+
508
+ try:
509
+ provider_info = MODEL_PROVIDERS_DICT.get(self.agent_llm)
510
+ if not provider_info:
511
+ msg = f"Invalid model provider: {self.agent_llm}"
512
+ raise ValueError(msg)
513
+
514
+ component_class = provider_info.get("component_class")
515
+ display_name = component_class.display_name
516
+ inputs = provider_info.get("inputs")
517
+ prefix = provider_info.get("prefix", "")
518
+ logger.debug(f"[CUGA] Successfully built LLM model from provider: {self.agent_llm}")
519
+ return self._build_llm_model(component_class, inputs, prefix), display_name
520
+
521
+ except (AttributeError, ValueError, TypeError, RuntimeError) as e:
522
+ await logger.aerror(f"[CUGA] Error building {self.agent_llm} language model: {e!s}")
523
+ msg = f"Failed to initialize language model: {e!s}"
524
+ raise ValueError(msg) from e
525
+
526
+ def _build_llm_model(self, component, inputs, prefix=""):
527
+ """Build LLM model with parameters.
528
+
529
+ This method constructs a language model instance using the provided component
530
+ class and input parameters.
531
+
532
+ Args:
533
+ component: The LLM component class to instantiate
534
+ inputs: List of input field definitions
535
+ prefix: Optional prefix for parameter names
536
+
537
+ Returns:
538
+ The configured LLM model instance
539
+ """
540
+ model_kwargs = {}
541
+ for input_ in inputs:
542
+ if hasattr(self, f"{prefix}{input_.name}"):
543
+ model_kwargs[input_.name] = getattr(self, f"{prefix}{input_.name}")
544
+ return component.set(**model_kwargs).build_model()
545
+
546
+ def set_component_params(self, component):
547
+ """Set component parameters based on provider.
548
+
549
+ This method configures component parameters according to the selected
550
+ model provider's requirements.
551
+
552
+ Args:
553
+ component: The component to configure
554
+
555
+ Returns:
556
+ The configured component
557
+ """
558
+ provider_info = MODEL_PROVIDERS_DICT.get(self.agent_llm)
559
+ if provider_info:
560
+ inputs = provider_info.get("inputs")
561
+ prefix = provider_info.get("prefix")
562
+ model_kwargs = {}
563
+ for input_ in inputs:
564
+ if hasattr(self, f"{prefix}{input_.name}"):
565
+ model_kwargs[input_.name] = getattr(self, f"{prefix}{input_.name}")
566
+ return component.set(**model_kwargs)
567
+ return component
568
+
569
+ def delete_fields(self, build_config: dotdict, fields: dict | list[str]) -> None:
570
+ """Delete specified fields from build_config.
571
+
572
+ This method removes unwanted fields from the build configuration.
573
+
574
+ Args:
575
+ build_config: The build configuration dictionary
576
+ fields: Fields to remove (can be dict or list of strings)
577
+ """
578
+ for field in fields:
579
+ build_config.pop(field, None)
580
+
581
+ def update_input_types(self, build_config: dotdict) -> dotdict:
582
+ """Update input types for all fields in build_config.
583
+
584
+ This method ensures all fields in the build configuration have proper
585
+ input types defined.
586
+
587
+ Args:
588
+ build_config: The build configuration to update
589
+
590
+ Returns:
591
+ dotdict: Updated build configuration with input types
592
+ """
593
+ for key, value in build_config.items():
594
+ if isinstance(value, dict):
595
+ if value.get("input_types") is None:
596
+ build_config[key]["input_types"] = []
597
+ elif hasattr(value, "input_types") and value.input_types is None:
598
+ value.input_types = []
599
+ return build_config
600
+
601
+ async def update_build_config(
602
+ self, build_config: dotdict, field_value: str, field_name: str | None = None
603
+ ) -> dotdict:
604
+ """Update build configuration based on field changes.
605
+
606
+ This method dynamically updates the component's build configuration when
607
+ certain fields change, particularly the model provider selection.
608
+
609
+ Args:
610
+ build_config: The current build configuration
611
+ field_value: The new value for the field
612
+ field_name: The name of the field being changed
613
+
614
+ Returns:
615
+ dotdict: Updated build configuration
616
+
617
+ Raises:
618
+ ValueError: If required keys are missing from the configuration
619
+ """
620
+ if field_name in ("agent_llm",):
621
+ build_config["agent_llm"]["value"] = field_value
622
+ provider_info = MODEL_PROVIDERS_DICT.get(field_value)
623
+ if provider_info:
624
+ component_class = provider_info.get("component_class")
625
+ if component_class and hasattr(component_class, "update_build_config"):
626
+ build_config = await update_component_build_config(
627
+ component_class, build_config, field_value, "model_name"
628
+ )
629
+
630
+ provider_configs: dict[str, tuple[dict, list[dict]]] = {
631
+ provider: (
632
+ MODEL_PROVIDERS_DICT[provider]["fields"],
633
+ [
634
+ MODEL_PROVIDERS_DICT[other_provider]["fields"]
635
+ for other_provider in MODEL_PROVIDERS_DICT
636
+ if other_provider != provider
637
+ ],
638
+ )
639
+ for provider in MODEL_PROVIDERS_DICT
640
+ }
641
+ if field_value in provider_configs:
642
+ fields_to_add, fields_to_delete = provider_configs[field_value]
643
+
644
+ # Delete fields from other providers
645
+ for fields in fields_to_delete:
646
+ self.delete_fields(build_config, fields)
647
+
648
+ # Add provider-specific fields
649
+ if field_value == "OpenAI" and not any(field in build_config for field in fields_to_add):
650
+ build_config.update(fields_to_add)
651
+ else:
652
+ build_config.update(fields_to_add)
653
+ build_config["agent_llm"]["input_types"] = []
654
+ elif field_value == "Custom":
655
+ # Delete all provider fields
656
+ self.delete_fields(build_config, ALL_PROVIDER_FIELDS)
657
+ # Update with custom component
658
+ custom_component = DropdownInput(
659
+ name="agent_llm",
660
+ display_name="Language Model",
661
+ options=[*sorted(MODEL_PROVIDERS), "Custom"],
662
+ value="Custom",
663
+ real_time_refresh=True,
664
+ input_types=["LanguageModel"],
665
+ options_metadata=[MODELS_METADATA[key] for key in sorted(MODELS_METADATA.keys())]
666
+ + [{"icon": "brain"}],
667
+ )
668
+ build_config.update({"agent_llm": custom_component.to_dict()})
669
+
670
+ # Update input types for all fields
671
+ build_config = self.update_input_types(build_config)
672
+
673
+ # Validate required keys
674
+ default_keys = [
675
+ "code",
676
+ "_type",
677
+ "agent_llm",
678
+ "tools",
679
+ "input_value",
680
+ "add_current_date_tool",
681
+ "policies",
682
+ "agent_description",
683
+ "max_iterations",
684
+ "handle_parsing_errors",
685
+ "verbose",
686
+ ]
687
+ missing_keys = [key for key in default_keys if key not in build_config]
688
+ if missing_keys:
689
+ msg = f"Missing required keys in build_config: {missing_keys}"
690
+ raise ValueError(msg)
691
+
692
+ if (
693
+ isinstance(self.agent_llm, str)
694
+ and self.agent_llm in MODEL_PROVIDERS_DICT
695
+ and field_name in MODEL_DYNAMIC_UPDATE_FIELDS
696
+ ):
697
+ provider_info = MODEL_PROVIDERS_DICT.get(self.agent_llm)
698
+ if provider_info:
699
+ component_class = provider_info.get("component_class")
700
+ component_class = self.set_component_params(component_class)
701
+ prefix = provider_info.get("prefix")
702
+ if component_class and hasattr(component_class, "update_build_config"):
703
+ if isinstance(field_name, str) and isinstance(prefix, str):
704
+ field_name = field_name.replace(prefix, "")
705
+ build_config = await update_component_build_config(
706
+ component_class, build_config, field_value, "model_name"
707
+ )
708
+ return dotdict({k: v.to_dict() if hasattr(v, "to_dict") else v for k, v in build_config.items()})
709
+
710
+ async def _get_tools(self) -> list[Tool]:
711
+ """Build agent tools.
712
+
713
+ This method constructs the list of tools available to the Cuga agent,
714
+ including component tools and any additional configured tools.
715
+
716
+ Returns:
717
+ list[Tool]: List of available tools for the agent
718
+ """
719
+ logger.debug("[CUGA] Building agent tools.")
720
+ component_toolkit = _get_component_toolkit()
721
+ tools_names = self._build_tools_names()
722
+ agent_description = self.get_tool_description()
723
+ description = f"{agent_description}{tools_names}"
724
+ tools = component_toolkit(component=self).get_tools(
725
+ tool_name="Call_CugaAgent", tool_description=description, callbacks=self.get_langchain_callbacks()
726
+ )
727
+ if hasattr(self, "tools_metadata"):
728
+ tools = component_toolkit(component=self, metadata=self.tools_metadata).update_tools_metadata(tools=tools)
729
+ logger.debug(f"[CUGA] Tools built: {[tool.name for tool in tools]}")
730
+ return tools