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,694 @@
1
+ from __future__ import annotations
2
+
3
+ import asyncio
4
+ import contextlib
5
+ import hashlib
6
+ import json
7
+ import re
8
+ import uuid
9
+ from dataclasses import asdict, dataclass, field
10
+ from datetime import datetime, timezone
11
+ from pathlib import Path
12
+ from typing import TYPE_CHECKING, Any
13
+
14
+ import pandas as pd
15
+ from cryptography.fernet import InvalidToken
16
+ from langchain_chroma import Chroma
17
+ from langflow.services.auth.utils import decrypt_api_key, encrypt_api_key
18
+ from langflow.services.database.models.user.crud import get_user_by_id
19
+
20
+ from lfx.base.knowledge_bases.knowledge_base_utils import get_knowledge_bases
21
+ from lfx.base.models.openai_constants import OPENAI_EMBEDDING_MODEL_NAMES
22
+ from lfx.components.processing.converter import convert_to_dataframe
23
+ from lfx.custom import Component
24
+ from lfx.io import (
25
+ BoolInput,
26
+ DropdownInput,
27
+ HandleInput,
28
+ IntInput,
29
+ Output,
30
+ SecretStrInput,
31
+ StrInput,
32
+ TableInput,
33
+ )
34
+ from lfx.schema.data import Data
35
+ from lfx.schema.table import EditMode
36
+ from lfx.services.deps import (
37
+ get_settings_service,
38
+ get_variable_service,
39
+ session_scope,
40
+ )
41
+
42
+ if TYPE_CHECKING:
43
+ from lfx.schema.dataframe import DataFrame
44
+
45
+ HUGGINGFACE_MODEL_NAMES = [
46
+ "sentence-transformers/all-MiniLM-L6-v2",
47
+ "sentence-transformers/all-mpnet-base-v2",
48
+ ]
49
+ COHERE_MODEL_NAMES = ["embed-english-v3.0", "embed-multilingual-v3.0"]
50
+
51
+ _KNOWLEDGE_BASES_ROOT_PATH: Path | None = None
52
+
53
+
54
+ def _get_knowledge_bases_root_path() -> Path:
55
+ """Lazy load the knowledge bases root path from settings."""
56
+ global _KNOWLEDGE_BASES_ROOT_PATH # noqa: PLW0603
57
+ if _KNOWLEDGE_BASES_ROOT_PATH is None:
58
+ settings = get_settings_service().settings
59
+ knowledge_directory = settings.knowledge_bases_dir
60
+ if not knowledge_directory:
61
+ msg = "Knowledge bases directory is not set in the settings."
62
+ raise ValueError(msg)
63
+ _KNOWLEDGE_BASES_ROOT_PATH = Path(knowledge_directory).expanduser()
64
+ return _KNOWLEDGE_BASES_ROOT_PATH
65
+
66
+
67
+ class KnowledgeIngestionComponent(Component):
68
+ """Create or append to Langflow Knowledge from a DataFrame."""
69
+
70
+ # ------ UI metadata ---------------------------------------------------
71
+ display_name = "Knowledge Ingestion"
72
+ description = "Create or update knowledge in Langflow."
73
+ icon = "upload"
74
+ name = "KnowledgeIngestion"
75
+
76
+ def __init__(self, *args, **kwargs) -> None:
77
+ super().__init__(*args, **kwargs)
78
+ self._cached_kb_path: Path | None = None
79
+
80
+ @dataclass
81
+ class NewKnowledgeBaseInput:
82
+ functionality: str = "create"
83
+ fields: dict[str, dict] = field(
84
+ default_factory=lambda: {
85
+ "data": {
86
+ "node": {
87
+ "name": "create_knowledge_base",
88
+ "description": "Create new knowledge in Langflow.",
89
+ "display_name": "Create new knowledge",
90
+ "field_order": [
91
+ "01_new_kb_name",
92
+ "02_embedding_model",
93
+ "03_api_key",
94
+ ],
95
+ "template": {
96
+ "01_new_kb_name": StrInput(
97
+ name="new_kb_name",
98
+ display_name="Knowledge Name",
99
+ info="Name of the new knowledge to create.",
100
+ required=True,
101
+ ),
102
+ "02_embedding_model": DropdownInput(
103
+ name="embedding_model",
104
+ display_name="Choose Embedding",
105
+ info="Select the embedding model to use for this knowledge base.",
106
+ required=True,
107
+ options=OPENAI_EMBEDDING_MODEL_NAMES + HUGGINGFACE_MODEL_NAMES + COHERE_MODEL_NAMES,
108
+ options_metadata=[{"icon": "OpenAI"} for _ in OPENAI_EMBEDDING_MODEL_NAMES]
109
+ + [{"icon": "HuggingFace"} for _ in HUGGINGFACE_MODEL_NAMES]
110
+ + [{"icon": "Cohere"} for _ in COHERE_MODEL_NAMES],
111
+ ),
112
+ "03_api_key": SecretStrInput(
113
+ name="api_key",
114
+ display_name="API Key",
115
+ info="Provider API key for embedding model",
116
+ required=True,
117
+ load_from_db=False,
118
+ ),
119
+ },
120
+ },
121
+ }
122
+ }
123
+ )
124
+
125
+ # ------ Inputs --------------------------------------------------------
126
+ inputs = [
127
+ DropdownInput(
128
+ name="knowledge_base",
129
+ display_name="Knowledge",
130
+ info="Select the knowledge to load data from.",
131
+ required=True,
132
+ options=[],
133
+ refresh_button=True,
134
+ real_time_refresh=True,
135
+ dialog_inputs=asdict(NewKnowledgeBaseInput()),
136
+ ),
137
+ HandleInput(
138
+ name="input_df",
139
+ display_name="Input",
140
+ info=(
141
+ "Table with all original columns (already chunked / processed). "
142
+ "Accepts Data or DataFrame. If Data is provided, it is converted to a DataFrame automatically."
143
+ ),
144
+ input_types=["Data", "DataFrame"],
145
+ required=True,
146
+ ),
147
+ TableInput(
148
+ name="column_config",
149
+ display_name="Column Configuration",
150
+ info="Configure column behavior for the knowledge base.",
151
+ required=True,
152
+ table_schema=[
153
+ {
154
+ "name": "column_name",
155
+ "display_name": "Column Name",
156
+ "type": "str",
157
+ "description": "Name of the column in the source DataFrame",
158
+ "edit_mode": EditMode.INLINE,
159
+ },
160
+ {
161
+ "name": "vectorize",
162
+ "display_name": "Vectorize",
163
+ "type": "boolean",
164
+ "description": "Create embeddings for this column",
165
+ "default": False,
166
+ "edit_mode": EditMode.INLINE,
167
+ },
168
+ {
169
+ "name": "identifier",
170
+ "display_name": "Identifier",
171
+ "type": "boolean",
172
+ "description": "Use this column as unique identifier",
173
+ "default": False,
174
+ "edit_mode": EditMode.INLINE,
175
+ },
176
+ ],
177
+ value=[
178
+ {
179
+ "column_name": "text",
180
+ "vectorize": True,
181
+ "identifier": True,
182
+ },
183
+ ],
184
+ ),
185
+ IntInput(
186
+ name="chunk_size",
187
+ display_name="Chunk Size",
188
+ info="Batch size for processing embeddings",
189
+ advanced=True,
190
+ value=1000,
191
+ ),
192
+ SecretStrInput(
193
+ name="api_key",
194
+ display_name="Embedding Provider API Key",
195
+ info="API key for the embedding provider to generate embeddings.",
196
+ advanced=True,
197
+ required=False,
198
+ ),
199
+ BoolInput(
200
+ name="allow_duplicates",
201
+ display_name="Allow Duplicates",
202
+ info="Allow duplicate rows in the knowledge base",
203
+ advanced=True,
204
+ value=False,
205
+ ),
206
+ ]
207
+
208
+ # ------ Outputs -------------------------------------------------------
209
+ outputs = [Output(display_name="Results", name="dataframe_output", method="build_kb_info")]
210
+
211
+ # ------ Internal helpers ---------------------------------------------
212
+ def _get_kb_root(self) -> Path:
213
+ """Return the root directory for knowledge bases."""
214
+ return _get_knowledge_bases_root_path()
215
+
216
+ def _validate_column_config(self, df_source: pd.DataFrame) -> list[dict[str, Any]]:
217
+ """Validate column configuration using Structured Output patterns."""
218
+ if not self.column_config:
219
+ msg = "Column configuration cannot be empty"
220
+ raise ValueError(msg)
221
+
222
+ # Convert table input to list of dicts (similar to Structured Output)
223
+ config_list = self.column_config if isinstance(self.column_config, list) else []
224
+
225
+ # Validate column names exist in DataFrame
226
+ df_columns = set(df_source.columns)
227
+ for config in config_list:
228
+ col_name = config.get("column_name")
229
+ if col_name not in df_columns:
230
+ msg = f"Column '{col_name}' not found in DataFrame. Available columns: {sorted(df_columns)}"
231
+ raise ValueError(msg)
232
+
233
+ return config_list
234
+
235
+ def _get_embedding_provider(self, embedding_model: str) -> str:
236
+ """Get embedding provider by matching model name to lists."""
237
+ if embedding_model in OPENAI_EMBEDDING_MODEL_NAMES:
238
+ return "OpenAI"
239
+ if embedding_model in HUGGINGFACE_MODEL_NAMES:
240
+ return "HuggingFace"
241
+ if embedding_model in COHERE_MODEL_NAMES:
242
+ return "Cohere"
243
+ return "Custom"
244
+
245
+ def _build_embeddings(self, embedding_model: str, api_key: str):
246
+ """Build embedding model using provider patterns."""
247
+ # Get provider by matching model name to lists
248
+ provider = self._get_embedding_provider(embedding_model)
249
+
250
+ # Validate provider and model
251
+ if provider == "OpenAI":
252
+ from langchain_openai import OpenAIEmbeddings
253
+
254
+ if not api_key:
255
+ msg = "OpenAI API key is required when using OpenAI provider"
256
+ raise ValueError(msg)
257
+ return OpenAIEmbeddings(
258
+ model=embedding_model,
259
+ api_key=api_key,
260
+ chunk_size=self.chunk_size,
261
+ )
262
+ if provider == "HuggingFace":
263
+ from langchain_huggingface import HuggingFaceEmbeddings
264
+
265
+ return HuggingFaceEmbeddings(
266
+ model=embedding_model,
267
+ )
268
+ if provider == "Cohere":
269
+ from langchain_cohere import CohereEmbeddings
270
+
271
+ if not api_key:
272
+ msg = "Cohere API key is required when using Cohere provider"
273
+ raise ValueError(msg)
274
+ return CohereEmbeddings(
275
+ model=embedding_model,
276
+ cohere_api_key=api_key,
277
+ )
278
+ if provider == "Custom":
279
+ # For custom embedding models, we would need additional configuration
280
+ msg = "Custom embedding models not yet supported"
281
+ raise NotImplementedError(msg)
282
+ msg = f"Unknown provider: {provider}"
283
+ raise ValueError(msg)
284
+
285
+ def _build_embedding_metadata(self, embedding_model, api_key) -> dict[str, Any]:
286
+ """Build embedding model metadata."""
287
+ # Get provider by matching model name to lists
288
+ embedding_provider = self._get_embedding_provider(embedding_model)
289
+
290
+ api_key_to_save = None
291
+ if api_key and hasattr(api_key, "get_secret_value"):
292
+ api_key_to_save = api_key.get_secret_value()
293
+ elif isinstance(api_key, str):
294
+ api_key_to_save = api_key
295
+
296
+ encrypted_api_key = None
297
+ if api_key_to_save:
298
+ settings_service = get_settings_service()
299
+ try:
300
+ encrypted_api_key = encrypt_api_key(api_key_to_save, settings_service=settings_service)
301
+ except (TypeError, ValueError) as e:
302
+ self.log(f"Could not encrypt API key: {e}")
303
+
304
+ return {
305
+ "embedding_provider": embedding_provider,
306
+ "embedding_model": embedding_model,
307
+ "api_key": encrypted_api_key,
308
+ "api_key_used": bool(api_key),
309
+ "chunk_size": self.chunk_size,
310
+ "created_at": datetime.now(timezone.utc).isoformat(),
311
+ }
312
+
313
+ def _save_embedding_metadata(self, kb_path: Path, embedding_model: str, api_key: str) -> None:
314
+ """Save embedding model metadata."""
315
+ embedding_metadata = self._build_embedding_metadata(embedding_model, api_key)
316
+ metadata_path = kb_path / "embedding_metadata.json"
317
+ metadata_path.write_text(json.dumps(embedding_metadata, indent=2))
318
+
319
+ def _save_kb_files(
320
+ self,
321
+ kb_path: Path,
322
+ config_list: list[dict[str, Any]],
323
+ ) -> None:
324
+ """Save KB files using File Component storage patterns."""
325
+ try:
326
+ # Create directory (following File Component patterns)
327
+ kb_path.mkdir(parents=True, exist_ok=True)
328
+
329
+ # Save column configuration
330
+ # Only do this if the file doesn't exist already
331
+ cfg_path = kb_path / "schema.json"
332
+ if not cfg_path.exists():
333
+ cfg_path.write_text(json.dumps(config_list, indent=2))
334
+
335
+ except (OSError, TypeError, ValueError) as e:
336
+ self.log(f"Error saving KB files: {e}")
337
+
338
+ def _build_column_metadata(self, config_list: list[dict[str, Any]], df_source: pd.DataFrame) -> dict[str, Any]:
339
+ """Build detailed column metadata."""
340
+ metadata: dict[str, Any] = {
341
+ "total_columns": len(df_source.columns),
342
+ "mapped_columns": len(config_list),
343
+ "unmapped_columns": len(df_source.columns) - len(config_list),
344
+ "columns": [],
345
+ "summary": {"vectorized_columns": [], "identifier_columns": []},
346
+ }
347
+
348
+ for config in config_list:
349
+ col_name = config.get("column_name")
350
+ vectorize = config.get("vectorize") == "True" or config.get("vectorize") is True
351
+ identifier = config.get("identifier") == "True" or config.get("identifier") is True
352
+
353
+ # Add to columns list
354
+ metadata["columns"].append(
355
+ {
356
+ "name": col_name,
357
+ "vectorize": vectorize,
358
+ "identifier": identifier,
359
+ }
360
+ )
361
+
362
+ # Update summary
363
+ if vectorize:
364
+ metadata["summary"]["vectorized_columns"].append(col_name)
365
+ if identifier:
366
+ metadata["summary"]["identifier_columns"].append(col_name)
367
+
368
+ return metadata
369
+
370
+ async def _create_vector_store(
371
+ self,
372
+ df_source: pd.DataFrame,
373
+ config_list: list[dict[str, Any]],
374
+ embedding_model: str,
375
+ api_key: str,
376
+ ) -> None:
377
+ """Create vector store following Local DB component pattern."""
378
+ try:
379
+ # Set up vector store directory
380
+ vector_store_dir = await self._kb_path()
381
+ if not vector_store_dir:
382
+ msg = "Knowledge base path is not set. Please create a new knowledge base first."
383
+ raise ValueError(msg)
384
+ vector_store_dir.mkdir(parents=True, exist_ok=True)
385
+
386
+ # Create embeddings model
387
+ embedding_function = self._build_embeddings(embedding_model, api_key)
388
+
389
+ # Convert DataFrame to Data objects (following Local DB pattern)
390
+ data_objects = await self._convert_df_to_data_objects(df_source, config_list)
391
+
392
+ # Create vector store
393
+ chroma = Chroma(
394
+ persist_directory=str(vector_store_dir),
395
+ embedding_function=embedding_function,
396
+ collection_name=self.knowledge_base,
397
+ )
398
+
399
+ # Convert Data objects to LangChain Documents
400
+ documents = []
401
+ for data_obj in data_objects:
402
+ doc = data_obj.to_lc_document()
403
+ documents.append(doc)
404
+
405
+ # Add documents to vector store
406
+ if documents:
407
+ chroma.add_documents(documents)
408
+ self.log(f"Added {len(documents)} documents to vector store '{self.knowledge_base}'")
409
+
410
+ except (OSError, ValueError, RuntimeError) as e:
411
+ self.log(f"Error creating vector store: {e}")
412
+
413
+ async def _convert_df_to_data_objects(
414
+ self, df_source: pd.DataFrame, config_list: list[dict[str, Any]]
415
+ ) -> list[Data]:
416
+ """Convert DataFrame to Data objects for vector store."""
417
+ data_objects: list[Data] = []
418
+
419
+ # Set up vector store directory
420
+ kb_path = await self._kb_path()
421
+
422
+ # If we don't allow duplicates, we need to get the existing hashes
423
+ chroma = Chroma(
424
+ persist_directory=str(kb_path),
425
+ collection_name=self.knowledge_base,
426
+ )
427
+
428
+ # Get all documents and their metadata
429
+ all_docs = chroma.get()
430
+
431
+ # Extract all _id values from metadata
432
+ id_list = [metadata.get("_id") for metadata in all_docs["metadatas"] if metadata.get("_id")]
433
+
434
+ # Get column roles
435
+ content_cols = []
436
+ identifier_cols = []
437
+
438
+ for config in config_list:
439
+ col_name = config.get("column_name")
440
+ vectorize = config.get("vectorize") == "True" or config.get("vectorize") is True
441
+ identifier = config.get("identifier") == "True" or config.get("identifier") is True
442
+
443
+ if vectorize:
444
+ content_cols.append(col_name)
445
+ elif identifier:
446
+ identifier_cols.append(col_name)
447
+
448
+ # Convert each row to a Data object
449
+ for _, row in df_source.iterrows():
450
+ # Build content text from identifier columns using list comprehension
451
+ identifier_parts = [str(row[col]) for col in content_cols if col in row and pd.notna(row[col])]
452
+
453
+ # Join all parts into a single string
454
+ page_content = " ".join(identifier_parts)
455
+
456
+ # Build metadata from NON-vectorized columns only (simple key-value pairs)
457
+ data_dict = {
458
+ "text": page_content, # Main content for vectorization
459
+ }
460
+
461
+ # Add identifier columns if they exist
462
+ if identifier_cols:
463
+ identifier_parts = [str(row[col]) for col in identifier_cols if col in row and pd.notna(row[col])]
464
+ page_content = " ".join(identifier_parts)
465
+
466
+ # Add metadata columns as simple key-value pairs
467
+ for col in df_source.columns:
468
+ if col not in content_cols and col in row and pd.notna(row[col]):
469
+ # Convert to simple types for Chroma metadata
470
+ value = row[col]
471
+ data_dict[col] = str(value) # Convert complex types to string
472
+
473
+ # Hash the page_content for unique ID
474
+ page_content_hash = hashlib.sha256(page_content.encode()).hexdigest()
475
+ data_dict["_id"] = page_content_hash
476
+
477
+ # If duplicates are disallowed, and hash exists, prevent adding this row
478
+ if not self.allow_duplicates and page_content_hash in id_list:
479
+ self.log(f"Skipping duplicate row with hash {page_content_hash}")
480
+ continue
481
+
482
+ # Create Data object - everything except "text" becomes metadata
483
+ data_obj = Data(data=data_dict)
484
+ data_objects.append(data_obj)
485
+
486
+ return data_objects
487
+
488
+ def is_valid_collection_name(self, name, min_length: int = 3, max_length: int = 63) -> bool:
489
+ """Validates collection name against conditions 1-3.
490
+
491
+ 1. Contains 3-63 characters
492
+ 2. Starts and ends with alphanumeric character
493
+ 3. Contains only alphanumeric characters, underscores, or hyphens.
494
+
495
+ Args:
496
+ name (str): Collection name to validate
497
+ min_length (int): Minimum length of the name
498
+ max_length (int): Maximum length of the name
499
+
500
+ Returns:
501
+ bool: True if valid, False otherwise
502
+ """
503
+ # Check length (condition 1)
504
+ if not (min_length <= len(name) <= max_length):
505
+ return False
506
+
507
+ # Check start/end with alphanumeric (condition 2)
508
+ if not (name[0].isalnum() and name[-1].isalnum()):
509
+ return False
510
+
511
+ # Check allowed characters (condition 3)
512
+ return re.match(r"^[a-zA-Z0-9_-]+$", name) is not None
513
+
514
+ async def _kb_path(self) -> Path | None:
515
+ # Check if we already have the path cached
516
+ cached_path = getattr(self, "_cached_kb_path", None)
517
+ if cached_path is not None:
518
+ return cached_path
519
+
520
+ # If not cached, compute it
521
+ async with session_scope() as db:
522
+ if not self.user_id:
523
+ msg = "User ID is required for fetching knowledge base path."
524
+ raise ValueError(msg)
525
+ current_user = await get_user_by_id(db, self.user_id)
526
+ if not current_user:
527
+ msg = f"User with ID {self.user_id} not found."
528
+ raise ValueError(msg)
529
+ kb_user = current_user.username
530
+
531
+ kb_root = self._get_kb_root()
532
+
533
+ # Cache the result
534
+ self._cached_kb_path = kb_root / kb_user / self.knowledge_base
535
+
536
+ return self._cached_kb_path
537
+
538
+ # ---------------------------------------------------------------------
539
+ # OUTPUT METHODS
540
+ # ---------------------------------------------------------------------
541
+ async def build_kb_info(self) -> Data:
542
+ """Main ingestion routine → returns a dict with KB metadata."""
543
+ try:
544
+ input_value = self.input_df[0] if isinstance(self.input_df, list) else self.input_df
545
+ df_source: DataFrame = convert_to_dataframe(input_value, auto_parse=False)
546
+
547
+ # Validate column configuration (using Structured Output patterns)
548
+ config_list = self._validate_column_config(df_source)
549
+ column_metadata = self._build_column_metadata(config_list, df_source)
550
+
551
+ # Read the embedding info from the knowledge base folder
552
+ kb_path = await self._kb_path()
553
+ if not kb_path:
554
+ msg = "Knowledge base path is not set. Please create a new knowledge base first."
555
+ raise ValueError(msg)
556
+ metadata_path = kb_path / "embedding_metadata.json"
557
+
558
+ # If the API key is not provided, try to read it from the metadata file
559
+ if metadata_path.exists():
560
+ settings_service = get_settings_service()
561
+ metadata = json.loads(metadata_path.read_text())
562
+ embedding_model = metadata.get("embedding_model")
563
+ try:
564
+ api_key = decrypt_api_key(metadata["api_key"], settings_service)
565
+ except (InvalidToken, TypeError, ValueError) as e:
566
+ self.log(f"Could not decrypt API key. Please provide it manually. Error: {e}")
567
+
568
+ # Check if a custom API key was provided, update metadata if so
569
+ if self.api_key:
570
+ api_key = self.api_key
571
+ self._save_embedding_metadata(
572
+ kb_path=kb_path,
573
+ embedding_model=embedding_model,
574
+ api_key=api_key,
575
+ )
576
+
577
+ # Create vector store following Local DB component pattern
578
+ await self._create_vector_store(df_source, config_list, embedding_model=embedding_model, api_key=api_key)
579
+
580
+ # Save KB files (using File Component storage patterns)
581
+ self._save_kb_files(kb_path, config_list)
582
+
583
+ # Build metadata response
584
+ meta: dict[str, Any] = {
585
+ "kb_id": str(uuid.uuid4()),
586
+ "kb_name": self.knowledge_base,
587
+ "rows": len(df_source),
588
+ "column_metadata": column_metadata,
589
+ "path": str(kb_path),
590
+ "config_columns": len(config_list),
591
+ "timestamp": datetime.now(tz=timezone.utc).isoformat(),
592
+ }
593
+
594
+ # Set status message
595
+ self.status = f"✅ KB **{self.knowledge_base}** saved · {len(df_source)} chunks."
596
+
597
+ return Data(data=meta)
598
+
599
+ except (OSError, ValueError, RuntimeError, KeyError) as e:
600
+ msg = f"Error during KB ingestion: {e}"
601
+ raise RuntimeError(msg) from e
602
+
603
+ async def _get_api_key_variable(self, field_value: dict[str, Any]):
604
+ async with session_scope() as db:
605
+ if not self.user_id:
606
+ msg = "User ID is required for fetching global variables."
607
+ raise ValueError(msg)
608
+ current_user = await get_user_by_id(db, self.user_id)
609
+ if not current_user:
610
+ msg = f"User with ID {self.user_id} not found."
611
+ raise ValueError(msg)
612
+ variable_service = get_variable_service()
613
+
614
+ # Process the api_key field variable
615
+ return await variable_service.get_variable(
616
+ user_id=current_user.id,
617
+ name=field_value["03_api_key"],
618
+ field="",
619
+ session=db,
620
+ )
621
+
622
+ async def update_build_config(
623
+ self,
624
+ build_config,
625
+ field_value: Any,
626
+ field_name: str | None = None,
627
+ ):
628
+ """Update build configuration based on provider selection."""
629
+ # Create a new knowledge base
630
+ if field_name == "knowledge_base":
631
+ async with session_scope() as db:
632
+ if not self.user_id:
633
+ msg = "User ID is required for fetching knowledge base list."
634
+ raise ValueError(msg)
635
+ current_user = await get_user_by_id(db, self.user_id)
636
+ if not current_user:
637
+ msg = f"User with ID {self.user_id} not found."
638
+ raise ValueError(msg)
639
+ kb_user = current_user.username
640
+ if isinstance(field_value, dict) and "01_new_kb_name" in field_value:
641
+ # Validate the knowledge base name - Make sure it follows these rules:
642
+ if not self.is_valid_collection_name(field_value["01_new_kb_name"]):
643
+ msg = f"Invalid knowledge base name: {field_value['01_new_kb_name']}"
644
+ raise ValueError(msg)
645
+
646
+ api_key = field_value.get("03_api_key", None)
647
+ with contextlib.suppress(Exception):
648
+ # If the API key is a variable, resolve it
649
+ api_key = await self._get_api_key_variable(field_value)
650
+
651
+ # Make sure api_key is a string
652
+ if not isinstance(api_key, str):
653
+ msg = "API key must be a string."
654
+ raise ValueError(msg)
655
+
656
+ # We need to test the API Key one time against the embedding model
657
+ embed_model = self._build_embeddings(embedding_model=field_value["02_embedding_model"], api_key=api_key)
658
+
659
+ # Try to generate a dummy embedding to validate the API key without blocking the event loop
660
+ try:
661
+ await asyncio.wait_for(
662
+ asyncio.to_thread(embed_model.embed_query, "test"),
663
+ timeout=10,
664
+ )
665
+ except TimeoutError as e:
666
+ msg = "Embedding validation timed out. Please verify network connectivity and key."
667
+ raise ValueError(msg) from e
668
+ except Exception as e:
669
+ msg = f"Embedding validation failed: {e!s}"
670
+ raise ValueError(msg) from e
671
+
672
+ # Create the new knowledge base directory
673
+ kb_path = _get_knowledge_bases_root_path() / kb_user / field_value["01_new_kb_name"]
674
+ kb_path.mkdir(parents=True, exist_ok=True)
675
+
676
+ # Save the embedding metadata
677
+ build_config["knowledge_base"]["value"] = field_value["01_new_kb_name"]
678
+ self._save_embedding_metadata(
679
+ kb_path=kb_path,
680
+ embedding_model=field_value["02_embedding_model"],
681
+ api_key=api_key,
682
+ )
683
+
684
+ # Update the knowledge base options dynamically
685
+ build_config["knowledge_base"]["options"] = await get_knowledge_bases(
686
+ _get_knowledge_bases_root_path(),
687
+ user_id=self.user_id,
688
+ )
689
+
690
+ # If the selected knowledge base is not available, reset it
691
+ if build_config["knowledge_base"]["value"] not in build_config["knowledge_base"]["options"]:
692
+ build_config["knowledge_base"]["value"] = None
693
+
694
+ return build_config