lfx-nightly 0.1.11.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (699) hide show
  1. lfx/__init__.py +0 -0
  2. lfx/__main__.py +25 -0
  3. lfx/base/__init__.py +0 -0
  4. lfx/base/agents/__init__.py +0 -0
  5. lfx/base/agents/agent.py +268 -0
  6. lfx/base/agents/callback.py +130 -0
  7. lfx/base/agents/context.py +109 -0
  8. lfx/base/agents/crewai/__init__.py +0 -0
  9. lfx/base/agents/crewai/crew.py +231 -0
  10. lfx/base/agents/crewai/tasks.py +12 -0
  11. lfx/base/agents/default_prompts.py +23 -0
  12. lfx/base/agents/errors.py +15 -0
  13. lfx/base/agents/events.py +346 -0
  14. lfx/base/agents/utils.py +205 -0
  15. lfx/base/astra_assistants/__init__.py +0 -0
  16. lfx/base/astra_assistants/util.py +171 -0
  17. lfx/base/chains/__init__.py +0 -0
  18. lfx/base/chains/model.py +19 -0
  19. lfx/base/composio/__init__.py +0 -0
  20. lfx/base/composio/composio_base.py +1291 -0
  21. lfx/base/compressors/__init__.py +0 -0
  22. lfx/base/compressors/model.py +60 -0
  23. lfx/base/constants.py +46 -0
  24. lfx/base/curl/__init__.py +0 -0
  25. lfx/base/curl/parse.py +188 -0
  26. lfx/base/data/__init__.py +5 -0
  27. lfx/base/data/base_file.py +685 -0
  28. lfx/base/data/docling_utils.py +245 -0
  29. lfx/base/data/utils.py +198 -0
  30. lfx/base/document_transformers/__init__.py +0 -0
  31. lfx/base/document_transformers/model.py +43 -0
  32. lfx/base/embeddings/__init__.py +0 -0
  33. lfx/base/embeddings/aiml_embeddings.py +62 -0
  34. lfx/base/embeddings/model.py +26 -0
  35. lfx/base/flow_processing/__init__.py +0 -0
  36. lfx/base/flow_processing/utils.py +86 -0
  37. lfx/base/huggingface/__init__.py +0 -0
  38. lfx/base/huggingface/model_bridge.py +133 -0
  39. lfx/base/io/__init__.py +0 -0
  40. lfx/base/io/chat.py +20 -0
  41. lfx/base/io/text.py +22 -0
  42. lfx/base/langchain_utilities/__init__.py +0 -0
  43. lfx/base/langchain_utilities/model.py +35 -0
  44. lfx/base/langchain_utilities/spider_constants.py +1 -0
  45. lfx/base/langwatch/__init__.py +0 -0
  46. lfx/base/langwatch/utils.py +18 -0
  47. lfx/base/mcp/__init__.py +0 -0
  48. lfx/base/mcp/constants.py +2 -0
  49. lfx/base/mcp/util.py +1398 -0
  50. lfx/base/memory/__init__.py +0 -0
  51. lfx/base/memory/memory.py +49 -0
  52. lfx/base/memory/model.py +38 -0
  53. lfx/base/models/__init__.py +3 -0
  54. lfx/base/models/aiml_constants.py +51 -0
  55. lfx/base/models/anthropic_constants.py +47 -0
  56. lfx/base/models/aws_constants.py +151 -0
  57. lfx/base/models/chat_result.py +76 -0
  58. lfx/base/models/google_generative_ai_constants.py +70 -0
  59. lfx/base/models/groq_constants.py +134 -0
  60. lfx/base/models/model.py +375 -0
  61. lfx/base/models/model_input_constants.py +307 -0
  62. lfx/base/models/model_metadata.py +41 -0
  63. lfx/base/models/model_utils.py +8 -0
  64. lfx/base/models/novita_constants.py +35 -0
  65. lfx/base/models/ollama_constants.py +49 -0
  66. lfx/base/models/openai_constants.py +122 -0
  67. lfx/base/models/sambanova_constants.py +18 -0
  68. lfx/base/processing/__init__.py +0 -0
  69. lfx/base/prompts/__init__.py +0 -0
  70. lfx/base/prompts/api_utils.py +224 -0
  71. lfx/base/prompts/utils.py +61 -0
  72. lfx/base/textsplitters/__init__.py +0 -0
  73. lfx/base/textsplitters/model.py +28 -0
  74. lfx/base/tools/__init__.py +0 -0
  75. lfx/base/tools/base.py +26 -0
  76. lfx/base/tools/component_tool.py +325 -0
  77. lfx/base/tools/constants.py +49 -0
  78. lfx/base/tools/flow_tool.py +132 -0
  79. lfx/base/tools/run_flow.py +224 -0
  80. lfx/base/vectorstores/__init__.py +0 -0
  81. lfx/base/vectorstores/model.py +193 -0
  82. lfx/base/vectorstores/utils.py +22 -0
  83. lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
  84. lfx/cli/__init__.py +5 -0
  85. lfx/cli/commands.py +319 -0
  86. lfx/cli/common.py +650 -0
  87. lfx/cli/run.py +441 -0
  88. lfx/cli/script_loader.py +247 -0
  89. lfx/cli/serve_app.py +546 -0
  90. lfx/cli/validation.py +69 -0
  91. lfx/components/FAISS/__init__.py +34 -0
  92. lfx/components/FAISS/faiss.py +111 -0
  93. lfx/components/Notion/__init__.py +19 -0
  94. lfx/components/Notion/add_content_to_page.py +269 -0
  95. lfx/components/Notion/create_page.py +94 -0
  96. lfx/components/Notion/list_database_properties.py +68 -0
  97. lfx/components/Notion/list_pages.py +122 -0
  98. lfx/components/Notion/list_users.py +77 -0
  99. lfx/components/Notion/page_content_viewer.py +93 -0
  100. lfx/components/Notion/search.py +111 -0
  101. lfx/components/Notion/update_page_property.py +114 -0
  102. lfx/components/__init__.py +411 -0
  103. lfx/components/_importing.py +42 -0
  104. lfx/components/agentql/__init__.py +3 -0
  105. lfx/components/agentql/agentql_api.py +151 -0
  106. lfx/components/agents/__init__.py +34 -0
  107. lfx/components/agents/agent.py +558 -0
  108. lfx/components/agents/mcp_component.py +501 -0
  109. lfx/components/aiml/__init__.py +37 -0
  110. lfx/components/aiml/aiml.py +112 -0
  111. lfx/components/aiml/aiml_embeddings.py +37 -0
  112. lfx/components/amazon/__init__.py +36 -0
  113. lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
  114. lfx/components/amazon/amazon_bedrock_model.py +124 -0
  115. lfx/components/amazon/s3_bucket_uploader.py +211 -0
  116. lfx/components/anthropic/__init__.py +34 -0
  117. lfx/components/anthropic/anthropic.py +187 -0
  118. lfx/components/apify/__init__.py +5 -0
  119. lfx/components/apify/apify_actor.py +325 -0
  120. lfx/components/arxiv/__init__.py +3 -0
  121. lfx/components/arxiv/arxiv.py +163 -0
  122. lfx/components/assemblyai/__init__.py +46 -0
  123. lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
  124. lfx/components/assemblyai/assemblyai_lemur.py +183 -0
  125. lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
  126. lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
  127. lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
  128. lfx/components/azure/__init__.py +37 -0
  129. lfx/components/azure/azure_openai.py +95 -0
  130. lfx/components/azure/azure_openai_embeddings.py +83 -0
  131. lfx/components/baidu/__init__.py +32 -0
  132. lfx/components/baidu/baidu_qianfan_chat.py +113 -0
  133. lfx/components/bing/__init__.py +3 -0
  134. lfx/components/bing/bing_search_api.py +61 -0
  135. lfx/components/cassandra/__init__.py +40 -0
  136. lfx/components/cassandra/cassandra.py +264 -0
  137. lfx/components/cassandra/cassandra_chat.py +92 -0
  138. lfx/components/cassandra/cassandra_graph.py +238 -0
  139. lfx/components/chains/__init__.py +3 -0
  140. lfx/components/chroma/__init__.py +34 -0
  141. lfx/components/chroma/chroma.py +167 -0
  142. lfx/components/cleanlab/__init__.py +40 -0
  143. lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
  144. lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
  145. lfx/components/cleanlab/cleanlab_remediator.py +131 -0
  146. lfx/components/clickhouse/__init__.py +34 -0
  147. lfx/components/clickhouse/clickhouse.py +135 -0
  148. lfx/components/cloudflare/__init__.py +32 -0
  149. lfx/components/cloudflare/cloudflare.py +81 -0
  150. lfx/components/cohere/__init__.py +40 -0
  151. lfx/components/cohere/cohere_embeddings.py +81 -0
  152. lfx/components/cohere/cohere_models.py +46 -0
  153. lfx/components/cohere/cohere_rerank.py +51 -0
  154. lfx/components/composio/__init__.py +74 -0
  155. lfx/components/composio/composio_api.py +268 -0
  156. lfx/components/composio/dropbox_compnent.py +11 -0
  157. lfx/components/composio/github_composio.py +11 -0
  158. lfx/components/composio/gmail_composio.py +38 -0
  159. lfx/components/composio/googlecalendar_composio.py +11 -0
  160. lfx/components/composio/googlemeet_composio.py +11 -0
  161. lfx/components/composio/googletasks_composio.py +8 -0
  162. lfx/components/composio/linear_composio.py +11 -0
  163. lfx/components/composio/outlook_composio.py +11 -0
  164. lfx/components/composio/reddit_composio.py +11 -0
  165. lfx/components/composio/slack_composio.py +582 -0
  166. lfx/components/composio/slackbot_composio.py +11 -0
  167. lfx/components/composio/supabase_composio.py +11 -0
  168. lfx/components/composio/todoist_composio.py +11 -0
  169. lfx/components/composio/youtube_composio.py +11 -0
  170. lfx/components/confluence/__init__.py +3 -0
  171. lfx/components/confluence/confluence.py +84 -0
  172. lfx/components/couchbase/__init__.py +34 -0
  173. lfx/components/couchbase/couchbase.py +102 -0
  174. lfx/components/crewai/__init__.py +49 -0
  175. lfx/components/crewai/crewai.py +107 -0
  176. lfx/components/crewai/hierarchical_crew.py +46 -0
  177. lfx/components/crewai/hierarchical_task.py +44 -0
  178. lfx/components/crewai/sequential_crew.py +52 -0
  179. lfx/components/crewai/sequential_task.py +73 -0
  180. lfx/components/crewai/sequential_task_agent.py +143 -0
  181. lfx/components/custom_component/__init__.py +34 -0
  182. lfx/components/custom_component/custom_component.py +31 -0
  183. lfx/components/data/__init__.py +64 -0
  184. lfx/components/data/api_request.py +544 -0
  185. lfx/components/data/csv_to_data.py +95 -0
  186. lfx/components/data/directory.py +113 -0
  187. lfx/components/data/file.py +577 -0
  188. lfx/components/data/json_to_data.py +98 -0
  189. lfx/components/data/news_search.py +164 -0
  190. lfx/components/data/rss.py +69 -0
  191. lfx/components/data/sql_executor.py +101 -0
  192. lfx/components/data/url.py +311 -0
  193. lfx/components/data/web_search.py +112 -0
  194. lfx/components/data/webhook.py +56 -0
  195. lfx/components/datastax/__init__.py +70 -0
  196. lfx/components/datastax/astra_assistant_manager.py +306 -0
  197. lfx/components/datastax/astra_db.py +75 -0
  198. lfx/components/datastax/astra_vectorize.py +124 -0
  199. lfx/components/datastax/astradb.py +1285 -0
  200. lfx/components/datastax/astradb_cql.py +314 -0
  201. lfx/components/datastax/astradb_graph.py +330 -0
  202. lfx/components/datastax/astradb_tool.py +414 -0
  203. lfx/components/datastax/astradb_vectorstore.py +1285 -0
  204. lfx/components/datastax/cassandra.py +92 -0
  205. lfx/components/datastax/create_assistant.py +58 -0
  206. lfx/components/datastax/create_thread.py +32 -0
  207. lfx/components/datastax/dotenv.py +35 -0
  208. lfx/components/datastax/get_assistant.py +37 -0
  209. lfx/components/datastax/getenvvar.py +30 -0
  210. lfx/components/datastax/graph_rag.py +141 -0
  211. lfx/components/datastax/hcd.py +314 -0
  212. lfx/components/datastax/list_assistants.py +25 -0
  213. lfx/components/datastax/run.py +89 -0
  214. lfx/components/deactivated/__init__.py +15 -0
  215. lfx/components/deactivated/amazon_kendra.py +66 -0
  216. lfx/components/deactivated/chat_litellm_model.py +158 -0
  217. lfx/components/deactivated/code_block_extractor.py +26 -0
  218. lfx/components/deactivated/documents_to_data.py +22 -0
  219. lfx/components/deactivated/embed.py +16 -0
  220. lfx/components/deactivated/extract_key_from_data.py +46 -0
  221. lfx/components/deactivated/json_document_builder.py +57 -0
  222. lfx/components/deactivated/list_flows.py +20 -0
  223. lfx/components/deactivated/mcp_sse.py +61 -0
  224. lfx/components/deactivated/mcp_stdio.py +62 -0
  225. lfx/components/deactivated/merge_data.py +93 -0
  226. lfx/components/deactivated/message.py +37 -0
  227. lfx/components/deactivated/metal.py +54 -0
  228. lfx/components/deactivated/multi_query.py +59 -0
  229. lfx/components/deactivated/retriever.py +43 -0
  230. lfx/components/deactivated/selective_passthrough.py +77 -0
  231. lfx/components/deactivated/should_run_next.py +40 -0
  232. lfx/components/deactivated/split_text.py +63 -0
  233. lfx/components/deactivated/store_message.py +24 -0
  234. lfx/components/deactivated/sub_flow.py +124 -0
  235. lfx/components/deactivated/vectara_self_query.py +76 -0
  236. lfx/components/deactivated/vector_store.py +24 -0
  237. lfx/components/deepseek/__init__.py +34 -0
  238. lfx/components/deepseek/deepseek.py +136 -0
  239. lfx/components/docling/__init__.py +43 -0
  240. lfx/components/docling/chunk_docling_document.py +186 -0
  241. lfx/components/docling/docling_inline.py +231 -0
  242. lfx/components/docling/docling_remote.py +193 -0
  243. lfx/components/docling/export_docling_document.py +117 -0
  244. lfx/components/documentloaders/__init__.py +3 -0
  245. lfx/components/duckduckgo/__init__.py +3 -0
  246. lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
  247. lfx/components/elastic/__init__.py +37 -0
  248. lfx/components/elastic/elasticsearch.py +267 -0
  249. lfx/components/elastic/opensearch.py +243 -0
  250. lfx/components/embeddings/__init__.py +37 -0
  251. lfx/components/embeddings/similarity.py +76 -0
  252. lfx/components/embeddings/text_embedder.py +64 -0
  253. lfx/components/exa/__init__.py +3 -0
  254. lfx/components/exa/exa_search.py +68 -0
  255. lfx/components/firecrawl/__init__.py +43 -0
  256. lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
  257. lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
  258. lfx/components/firecrawl/firecrawl_map_api.py +89 -0
  259. lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
  260. lfx/components/git/__init__.py +4 -0
  261. lfx/components/git/git.py +262 -0
  262. lfx/components/git/gitextractor.py +196 -0
  263. lfx/components/glean/__init__.py +3 -0
  264. lfx/components/glean/glean_search_api.py +173 -0
  265. lfx/components/google/__init__.py +17 -0
  266. lfx/components/google/gmail.py +192 -0
  267. lfx/components/google/google_bq_sql_executor.py +157 -0
  268. lfx/components/google/google_drive.py +92 -0
  269. lfx/components/google/google_drive_search.py +152 -0
  270. lfx/components/google/google_generative_ai.py +147 -0
  271. lfx/components/google/google_generative_ai_embeddings.py +141 -0
  272. lfx/components/google/google_oauth_token.py +89 -0
  273. lfx/components/google/google_search_api_core.py +68 -0
  274. lfx/components/google/google_serper_api_core.py +74 -0
  275. lfx/components/groq/__init__.py +34 -0
  276. lfx/components/groq/groq.py +136 -0
  277. lfx/components/helpers/__init__.py +52 -0
  278. lfx/components/helpers/calculator_core.py +89 -0
  279. lfx/components/helpers/create_list.py +40 -0
  280. lfx/components/helpers/current_date.py +42 -0
  281. lfx/components/helpers/id_generator.py +42 -0
  282. lfx/components/helpers/memory.py +251 -0
  283. lfx/components/helpers/output_parser.py +45 -0
  284. lfx/components/helpers/store_message.py +90 -0
  285. lfx/components/homeassistant/__init__.py +7 -0
  286. lfx/components/homeassistant/home_assistant_control.py +152 -0
  287. lfx/components/homeassistant/list_home_assistant_states.py +137 -0
  288. lfx/components/huggingface/__init__.py +37 -0
  289. lfx/components/huggingface/huggingface.py +197 -0
  290. lfx/components/huggingface/huggingface_inference_api.py +106 -0
  291. lfx/components/ibm/__init__.py +34 -0
  292. lfx/components/ibm/watsonx.py +203 -0
  293. lfx/components/ibm/watsonx_embeddings.py +135 -0
  294. lfx/components/icosacomputing/__init__.py +5 -0
  295. lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
  296. lfx/components/input_output/__init__.py +38 -0
  297. lfx/components/input_output/chat.py +120 -0
  298. lfx/components/input_output/chat_output.py +200 -0
  299. lfx/components/input_output/text.py +27 -0
  300. lfx/components/input_output/text_output.py +29 -0
  301. lfx/components/jigsawstack/__init__.py +23 -0
  302. lfx/components/jigsawstack/ai_scrape.py +126 -0
  303. lfx/components/jigsawstack/ai_web_search.py +136 -0
  304. lfx/components/jigsawstack/file_read.py +115 -0
  305. lfx/components/jigsawstack/file_upload.py +94 -0
  306. lfx/components/jigsawstack/image_generation.py +205 -0
  307. lfx/components/jigsawstack/nsfw.py +60 -0
  308. lfx/components/jigsawstack/object_detection.py +124 -0
  309. lfx/components/jigsawstack/sentiment.py +112 -0
  310. lfx/components/jigsawstack/text_to_sql.py +90 -0
  311. lfx/components/jigsawstack/text_translate.py +77 -0
  312. lfx/components/jigsawstack/vocr.py +107 -0
  313. lfx/components/langchain_utilities/__init__.py +109 -0
  314. lfx/components/langchain_utilities/character.py +53 -0
  315. lfx/components/langchain_utilities/conversation.py +59 -0
  316. lfx/components/langchain_utilities/csv_agent.py +107 -0
  317. lfx/components/langchain_utilities/fake_embeddings.py +26 -0
  318. lfx/components/langchain_utilities/html_link_extractor.py +35 -0
  319. lfx/components/langchain_utilities/json_agent.py +45 -0
  320. lfx/components/langchain_utilities/langchain_hub.py +126 -0
  321. lfx/components/langchain_utilities/language_recursive.py +49 -0
  322. lfx/components/langchain_utilities/language_semantic.py +138 -0
  323. lfx/components/langchain_utilities/llm_checker.py +39 -0
  324. lfx/components/langchain_utilities/llm_math.py +42 -0
  325. lfx/components/langchain_utilities/natural_language.py +61 -0
  326. lfx/components/langchain_utilities/openai_tools.py +53 -0
  327. lfx/components/langchain_utilities/openapi.py +48 -0
  328. lfx/components/langchain_utilities/recursive_character.py +60 -0
  329. lfx/components/langchain_utilities/retrieval_qa.py +83 -0
  330. lfx/components/langchain_utilities/runnable_executor.py +137 -0
  331. lfx/components/langchain_utilities/self_query.py +80 -0
  332. lfx/components/langchain_utilities/spider.py +142 -0
  333. lfx/components/langchain_utilities/sql.py +40 -0
  334. lfx/components/langchain_utilities/sql_database.py +35 -0
  335. lfx/components/langchain_utilities/sql_generator.py +78 -0
  336. lfx/components/langchain_utilities/tool_calling.py +59 -0
  337. lfx/components/langchain_utilities/vector_store_info.py +49 -0
  338. lfx/components/langchain_utilities/vector_store_router.py +33 -0
  339. lfx/components/langchain_utilities/xml_agent.py +71 -0
  340. lfx/components/langwatch/__init__.py +3 -0
  341. lfx/components/langwatch/langwatch.py +278 -0
  342. lfx/components/link_extractors/__init__.py +3 -0
  343. lfx/components/lmstudio/__init__.py +34 -0
  344. lfx/components/lmstudio/lmstudioembeddings.py +89 -0
  345. lfx/components/lmstudio/lmstudiomodel.py +129 -0
  346. lfx/components/logic/__init__.py +52 -0
  347. lfx/components/logic/conditional_router.py +171 -0
  348. lfx/components/logic/data_conditional_router.py +125 -0
  349. lfx/components/logic/flow_tool.py +110 -0
  350. lfx/components/logic/listen.py +29 -0
  351. lfx/components/logic/loop.py +125 -0
  352. lfx/components/logic/notify.py +88 -0
  353. lfx/components/logic/pass_message.py +35 -0
  354. lfx/components/logic/run_flow.py +71 -0
  355. lfx/components/logic/sub_flow.py +114 -0
  356. lfx/components/maritalk/__init__.py +32 -0
  357. lfx/components/maritalk/maritalk.py +52 -0
  358. lfx/components/mem0/__init__.py +3 -0
  359. lfx/components/mem0/mem0_chat_memory.py +136 -0
  360. lfx/components/milvus/__init__.py +34 -0
  361. lfx/components/milvus/milvus.py +115 -0
  362. lfx/components/mistral/__init__.py +37 -0
  363. lfx/components/mistral/mistral.py +114 -0
  364. lfx/components/mistral/mistral_embeddings.py +58 -0
  365. lfx/components/models/__init__.py +34 -0
  366. lfx/components/models/embedding_model.py +114 -0
  367. lfx/components/models/language_model.py +144 -0
  368. lfx/components/mongodb/__init__.py +34 -0
  369. lfx/components/mongodb/mongodb_atlas.py +213 -0
  370. lfx/components/needle/__init__.py +3 -0
  371. lfx/components/needle/needle.py +104 -0
  372. lfx/components/notdiamond/__init__.py +34 -0
  373. lfx/components/notdiamond/notdiamond.py +228 -0
  374. lfx/components/novita/__init__.py +32 -0
  375. lfx/components/novita/novita.py +130 -0
  376. lfx/components/nvidia/__init__.py +57 -0
  377. lfx/components/nvidia/nvidia.py +157 -0
  378. lfx/components/nvidia/nvidia_embedding.py +77 -0
  379. lfx/components/nvidia/nvidia_ingest.py +317 -0
  380. lfx/components/nvidia/nvidia_rerank.py +63 -0
  381. lfx/components/nvidia/system_assist.py +65 -0
  382. lfx/components/olivya/__init__.py +3 -0
  383. lfx/components/olivya/olivya.py +116 -0
  384. lfx/components/ollama/__init__.py +37 -0
  385. lfx/components/ollama/ollama.py +330 -0
  386. lfx/components/ollama/ollama_embeddings.py +106 -0
  387. lfx/components/openai/__init__.py +37 -0
  388. lfx/components/openai/openai.py +100 -0
  389. lfx/components/openai/openai_chat_model.py +176 -0
  390. lfx/components/openrouter/__init__.py +32 -0
  391. lfx/components/openrouter/openrouter.py +202 -0
  392. lfx/components/output_parsers/__init__.py +3 -0
  393. lfx/components/perplexity/__init__.py +34 -0
  394. lfx/components/perplexity/perplexity.py +75 -0
  395. lfx/components/pgvector/__init__.py +34 -0
  396. lfx/components/pgvector/pgvector.py +72 -0
  397. lfx/components/pinecone/__init__.py +34 -0
  398. lfx/components/pinecone/pinecone.py +134 -0
  399. lfx/components/processing/__init__.py +117 -0
  400. lfx/components/processing/alter_metadata.py +108 -0
  401. lfx/components/processing/batch_run.py +205 -0
  402. lfx/components/processing/combine_text.py +39 -0
  403. lfx/components/processing/converter.py +159 -0
  404. lfx/components/processing/create_data.py +110 -0
  405. lfx/components/processing/data_operations.py +438 -0
  406. lfx/components/processing/data_to_dataframe.py +70 -0
  407. lfx/components/processing/dataframe_operations.py +313 -0
  408. lfx/components/processing/extract_key.py +53 -0
  409. lfx/components/processing/filter_data.py +42 -0
  410. lfx/components/processing/filter_data_values.py +88 -0
  411. lfx/components/processing/json_cleaner.py +103 -0
  412. lfx/components/processing/lambda_filter.py +154 -0
  413. lfx/components/processing/llm_router.py +499 -0
  414. lfx/components/processing/merge_data.py +90 -0
  415. lfx/components/processing/message_to_data.py +36 -0
  416. lfx/components/processing/parse_data.py +70 -0
  417. lfx/components/processing/parse_dataframe.py +68 -0
  418. lfx/components/processing/parse_json_data.py +90 -0
  419. lfx/components/processing/parser.py +143 -0
  420. lfx/components/processing/prompt.py +67 -0
  421. lfx/components/processing/python_repl_core.py +98 -0
  422. lfx/components/processing/regex.py +82 -0
  423. lfx/components/processing/save_file.py +225 -0
  424. lfx/components/processing/select_data.py +48 -0
  425. lfx/components/processing/split_text.py +141 -0
  426. lfx/components/processing/structured_output.py +202 -0
  427. lfx/components/processing/update_data.py +160 -0
  428. lfx/components/prototypes/__init__.py +34 -0
  429. lfx/components/prototypes/python_function.py +73 -0
  430. lfx/components/qdrant/__init__.py +34 -0
  431. lfx/components/qdrant/qdrant.py +109 -0
  432. lfx/components/redis/__init__.py +37 -0
  433. lfx/components/redis/redis.py +89 -0
  434. lfx/components/redis/redis_chat.py +43 -0
  435. lfx/components/sambanova/__init__.py +32 -0
  436. lfx/components/sambanova/sambanova.py +84 -0
  437. lfx/components/scrapegraph/__init__.py +40 -0
  438. lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
  439. lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
  440. lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
  441. lfx/components/searchapi/__init__.py +34 -0
  442. lfx/components/searchapi/search.py +79 -0
  443. lfx/components/serpapi/__init__.py +3 -0
  444. lfx/components/serpapi/serp.py +115 -0
  445. lfx/components/supabase/__init__.py +34 -0
  446. lfx/components/supabase/supabase.py +76 -0
  447. lfx/components/tavily/__init__.py +4 -0
  448. lfx/components/tavily/tavily_extract.py +117 -0
  449. lfx/components/tavily/tavily_search.py +212 -0
  450. lfx/components/textsplitters/__init__.py +3 -0
  451. lfx/components/toolkits/__init__.py +3 -0
  452. lfx/components/tools/__init__.py +72 -0
  453. lfx/components/tools/calculator.py +108 -0
  454. lfx/components/tools/google_search_api.py +45 -0
  455. lfx/components/tools/google_serper_api.py +115 -0
  456. lfx/components/tools/python_code_structured_tool.py +327 -0
  457. lfx/components/tools/python_repl.py +97 -0
  458. lfx/components/tools/search_api.py +87 -0
  459. lfx/components/tools/searxng.py +145 -0
  460. lfx/components/tools/serp_api.py +119 -0
  461. lfx/components/tools/tavily_search_tool.py +344 -0
  462. lfx/components/tools/wikidata_api.py +102 -0
  463. lfx/components/tools/wikipedia_api.py +49 -0
  464. lfx/components/tools/yahoo_finance.py +129 -0
  465. lfx/components/twelvelabs/__init__.py +52 -0
  466. lfx/components/twelvelabs/convert_astra_results.py +84 -0
  467. lfx/components/twelvelabs/pegasus_index.py +311 -0
  468. lfx/components/twelvelabs/split_video.py +291 -0
  469. lfx/components/twelvelabs/text_embeddings.py +57 -0
  470. lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
  471. lfx/components/twelvelabs/video_embeddings.py +100 -0
  472. lfx/components/twelvelabs/video_file.py +179 -0
  473. lfx/components/unstructured/__init__.py +3 -0
  474. lfx/components/unstructured/unstructured.py +121 -0
  475. lfx/components/upstash/__init__.py +34 -0
  476. lfx/components/upstash/upstash.py +124 -0
  477. lfx/components/vectara/__init__.py +37 -0
  478. lfx/components/vectara/vectara.py +97 -0
  479. lfx/components/vectara/vectara_rag.py +164 -0
  480. lfx/components/vectorstores/__init__.py +40 -0
  481. lfx/components/vectorstores/astradb.py +1285 -0
  482. lfx/components/vectorstores/astradb_graph.py +319 -0
  483. lfx/components/vectorstores/cassandra.py +264 -0
  484. lfx/components/vectorstores/cassandra_graph.py +238 -0
  485. lfx/components/vectorstores/chroma.py +167 -0
  486. lfx/components/vectorstores/clickhouse.py +135 -0
  487. lfx/components/vectorstores/couchbase.py +102 -0
  488. lfx/components/vectorstores/elasticsearch.py +267 -0
  489. lfx/components/vectorstores/faiss.py +111 -0
  490. lfx/components/vectorstores/graph_rag.py +141 -0
  491. lfx/components/vectorstores/hcd.py +314 -0
  492. lfx/components/vectorstores/local_db.py +261 -0
  493. lfx/components/vectorstores/milvus.py +115 -0
  494. lfx/components/vectorstores/mongodb_atlas.py +213 -0
  495. lfx/components/vectorstores/opensearch.py +243 -0
  496. lfx/components/vectorstores/pgvector.py +72 -0
  497. lfx/components/vectorstores/pinecone.py +134 -0
  498. lfx/components/vectorstores/qdrant.py +109 -0
  499. lfx/components/vectorstores/supabase.py +76 -0
  500. lfx/components/vectorstores/upstash.py +124 -0
  501. lfx/components/vectorstores/vectara.py +97 -0
  502. lfx/components/vectorstores/vectara_rag.py +164 -0
  503. lfx/components/vectorstores/weaviate.py +89 -0
  504. lfx/components/vertexai/__init__.py +37 -0
  505. lfx/components/vertexai/vertexai.py +71 -0
  506. lfx/components/vertexai/vertexai_embeddings.py +67 -0
  507. lfx/components/weaviate/__init__.py +34 -0
  508. lfx/components/weaviate/weaviate.py +89 -0
  509. lfx/components/wikipedia/__init__.py +4 -0
  510. lfx/components/wikipedia/wikidata.py +86 -0
  511. lfx/components/wikipedia/wikipedia.py +53 -0
  512. lfx/components/wolframalpha/__init__.py +3 -0
  513. lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
  514. lfx/components/xai/__init__.py +32 -0
  515. lfx/components/xai/xai.py +167 -0
  516. lfx/components/yahoosearch/__init__.py +3 -0
  517. lfx/components/yahoosearch/yahoo.py +137 -0
  518. lfx/components/youtube/__init__.py +52 -0
  519. lfx/components/youtube/channel.py +227 -0
  520. lfx/components/youtube/comments.py +231 -0
  521. lfx/components/youtube/playlist.py +33 -0
  522. lfx/components/youtube/search.py +120 -0
  523. lfx/components/youtube/trending.py +285 -0
  524. lfx/components/youtube/video_details.py +263 -0
  525. lfx/components/youtube/youtube_transcripts.py +118 -0
  526. lfx/components/zep/__init__.py +3 -0
  527. lfx/components/zep/zep.py +44 -0
  528. lfx/constants.py +6 -0
  529. lfx/custom/__init__.py +7 -0
  530. lfx/custom/attributes.py +86 -0
  531. lfx/custom/code_parser/__init__.py +3 -0
  532. lfx/custom/code_parser/code_parser.py +361 -0
  533. lfx/custom/custom_component/__init__.py +0 -0
  534. lfx/custom/custom_component/base_component.py +128 -0
  535. lfx/custom/custom_component/component.py +1808 -0
  536. lfx/custom/custom_component/component_with_cache.py +8 -0
  537. lfx/custom/custom_component/custom_component.py +588 -0
  538. lfx/custom/dependency_analyzer.py +165 -0
  539. lfx/custom/directory_reader/__init__.py +3 -0
  540. lfx/custom/directory_reader/directory_reader.py +359 -0
  541. lfx/custom/directory_reader/utils.py +171 -0
  542. lfx/custom/eval.py +12 -0
  543. lfx/custom/schema.py +32 -0
  544. lfx/custom/tree_visitor.py +21 -0
  545. lfx/custom/utils.py +877 -0
  546. lfx/custom/validate.py +488 -0
  547. lfx/events/__init__.py +1 -0
  548. lfx/events/event_manager.py +110 -0
  549. lfx/exceptions/__init__.py +0 -0
  550. lfx/exceptions/component.py +15 -0
  551. lfx/field_typing/__init__.py +91 -0
  552. lfx/field_typing/constants.py +215 -0
  553. lfx/field_typing/range_spec.py +35 -0
  554. lfx/graph/__init__.py +6 -0
  555. lfx/graph/edge/__init__.py +0 -0
  556. lfx/graph/edge/base.py +277 -0
  557. lfx/graph/edge/schema.py +119 -0
  558. lfx/graph/edge/utils.py +0 -0
  559. lfx/graph/graph/__init__.py +0 -0
  560. lfx/graph/graph/ascii.py +202 -0
  561. lfx/graph/graph/base.py +2238 -0
  562. lfx/graph/graph/constants.py +63 -0
  563. lfx/graph/graph/runnable_vertices_manager.py +133 -0
  564. lfx/graph/graph/schema.py +52 -0
  565. lfx/graph/graph/state_model.py +66 -0
  566. lfx/graph/graph/utils.py +1024 -0
  567. lfx/graph/schema.py +75 -0
  568. lfx/graph/state/__init__.py +0 -0
  569. lfx/graph/state/model.py +237 -0
  570. lfx/graph/utils.py +200 -0
  571. lfx/graph/vertex/__init__.py +0 -0
  572. lfx/graph/vertex/base.py +823 -0
  573. lfx/graph/vertex/constants.py +0 -0
  574. lfx/graph/vertex/exceptions.py +4 -0
  575. lfx/graph/vertex/param_handler.py +264 -0
  576. lfx/graph/vertex/schema.py +26 -0
  577. lfx/graph/vertex/utils.py +19 -0
  578. lfx/graph/vertex/vertex_types.py +489 -0
  579. lfx/helpers/__init__.py +1 -0
  580. lfx/helpers/base_model.py +71 -0
  581. lfx/helpers/custom.py +13 -0
  582. lfx/helpers/data.py +167 -0
  583. lfx/helpers/flow.py +194 -0
  584. lfx/inputs/__init__.py +68 -0
  585. lfx/inputs/constants.py +2 -0
  586. lfx/inputs/input_mixin.py +328 -0
  587. lfx/inputs/inputs.py +714 -0
  588. lfx/inputs/validators.py +19 -0
  589. lfx/interface/__init__.py +6 -0
  590. lfx/interface/components.py +489 -0
  591. lfx/interface/importing/__init__.py +5 -0
  592. lfx/interface/importing/utils.py +39 -0
  593. lfx/interface/initialize/__init__.py +3 -0
  594. lfx/interface/initialize/loading.py +224 -0
  595. lfx/interface/listing.py +26 -0
  596. lfx/interface/run.py +16 -0
  597. lfx/interface/utils.py +111 -0
  598. lfx/io/__init__.py +63 -0
  599. lfx/io/schema.py +289 -0
  600. lfx/load/__init__.py +8 -0
  601. lfx/load/load.py +256 -0
  602. lfx/load/utils.py +99 -0
  603. lfx/log/__init__.py +5 -0
  604. lfx/log/logger.py +385 -0
  605. lfx/memory/__init__.py +90 -0
  606. lfx/memory/stubs.py +283 -0
  607. lfx/processing/__init__.py +1 -0
  608. lfx/processing/process.py +238 -0
  609. lfx/processing/utils.py +25 -0
  610. lfx/py.typed +0 -0
  611. lfx/schema/__init__.py +66 -0
  612. lfx/schema/artifact.py +83 -0
  613. lfx/schema/content_block.py +62 -0
  614. lfx/schema/content_types.py +91 -0
  615. lfx/schema/data.py +308 -0
  616. lfx/schema/dataframe.py +210 -0
  617. lfx/schema/dotdict.py +74 -0
  618. lfx/schema/encoders.py +13 -0
  619. lfx/schema/graph.py +47 -0
  620. lfx/schema/image.py +131 -0
  621. lfx/schema/json_schema.py +141 -0
  622. lfx/schema/log.py +61 -0
  623. lfx/schema/message.py +473 -0
  624. lfx/schema/openai_responses_schemas.py +74 -0
  625. lfx/schema/properties.py +41 -0
  626. lfx/schema/schema.py +171 -0
  627. lfx/schema/serialize.py +13 -0
  628. lfx/schema/table.py +140 -0
  629. lfx/schema/validators.py +114 -0
  630. lfx/serialization/__init__.py +5 -0
  631. lfx/serialization/constants.py +2 -0
  632. lfx/serialization/serialization.py +314 -0
  633. lfx/services/__init__.py +23 -0
  634. lfx/services/base.py +28 -0
  635. lfx/services/cache/__init__.py +6 -0
  636. lfx/services/cache/base.py +183 -0
  637. lfx/services/cache/service.py +166 -0
  638. lfx/services/cache/utils.py +169 -0
  639. lfx/services/chat/__init__.py +1 -0
  640. lfx/services/chat/config.py +2 -0
  641. lfx/services/chat/schema.py +10 -0
  642. lfx/services/deps.py +129 -0
  643. lfx/services/factory.py +19 -0
  644. lfx/services/initialize.py +19 -0
  645. lfx/services/interfaces.py +103 -0
  646. lfx/services/manager.py +172 -0
  647. lfx/services/schema.py +20 -0
  648. lfx/services/session.py +82 -0
  649. lfx/services/settings/__init__.py +3 -0
  650. lfx/services/settings/auth.py +130 -0
  651. lfx/services/settings/base.py +539 -0
  652. lfx/services/settings/constants.py +31 -0
  653. lfx/services/settings/factory.py +23 -0
  654. lfx/services/settings/feature_flags.py +12 -0
  655. lfx/services/settings/service.py +35 -0
  656. lfx/services/settings/utils.py +40 -0
  657. lfx/services/shared_component_cache/__init__.py +1 -0
  658. lfx/services/shared_component_cache/factory.py +30 -0
  659. lfx/services/shared_component_cache/service.py +9 -0
  660. lfx/services/storage/__init__.py +5 -0
  661. lfx/services/storage/local.py +155 -0
  662. lfx/services/storage/service.py +54 -0
  663. lfx/services/tracing/__init__.py +1 -0
  664. lfx/services/tracing/service.py +21 -0
  665. lfx/settings.py +6 -0
  666. lfx/template/__init__.py +6 -0
  667. lfx/template/field/__init__.py +0 -0
  668. lfx/template/field/base.py +257 -0
  669. lfx/template/field/prompt.py +15 -0
  670. lfx/template/frontend_node/__init__.py +6 -0
  671. lfx/template/frontend_node/base.py +212 -0
  672. lfx/template/frontend_node/constants.py +65 -0
  673. lfx/template/frontend_node/custom_components.py +79 -0
  674. lfx/template/template/__init__.py +0 -0
  675. lfx/template/template/base.py +100 -0
  676. lfx/template/utils.py +217 -0
  677. lfx/type_extraction/__init__.py +19 -0
  678. lfx/type_extraction/type_extraction.py +75 -0
  679. lfx/type_extraction.py +80 -0
  680. lfx/utils/__init__.py +1 -0
  681. lfx/utils/async_helpers.py +42 -0
  682. lfx/utils/component_utils.py +154 -0
  683. lfx/utils/concurrency.py +60 -0
  684. lfx/utils/connection_string_parser.py +11 -0
  685. lfx/utils/constants.py +205 -0
  686. lfx/utils/data_structure.py +212 -0
  687. lfx/utils/exceptions.py +22 -0
  688. lfx/utils/helpers.py +28 -0
  689. lfx/utils/image.py +73 -0
  690. lfx/utils/lazy_load.py +15 -0
  691. lfx/utils/request_utils.py +18 -0
  692. lfx/utils/schemas.py +139 -0
  693. lfx/utils/util.py +481 -0
  694. lfx/utils/util_strings.py +56 -0
  695. lfx/utils/version.py +24 -0
  696. lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
  697. lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
  698. lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
  699. lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,167 @@
1
+ from copy import deepcopy
2
+ from typing import TYPE_CHECKING
3
+
4
+ from chromadb.config import Settings
5
+ from langchain_chroma import Chroma
6
+ from typing_extensions import override
7
+
8
+ from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
9
+ from lfx.base.vectorstores.utils import chroma_collection_to_data
10
+ from lfx.inputs.inputs import BoolInput, DropdownInput, HandleInput, IntInput, StrInput
11
+ from lfx.schema.data import Data
12
+
13
+ if TYPE_CHECKING:
14
+ from lfx.schema.dataframe import DataFrame
15
+
16
+
17
+ class ChromaVectorStoreComponent(LCVectorStoreComponent):
18
+ """Chroma Vector Store with search capabilities."""
19
+
20
+ display_name: str = "Chroma DB"
21
+ description: str = "Chroma Vector Store with search capabilities"
22
+ name = "Chroma"
23
+ icon = "Chroma"
24
+
25
+ inputs = [
26
+ StrInput(
27
+ name="collection_name",
28
+ display_name="Collection Name",
29
+ value="langflow",
30
+ ),
31
+ StrInput(
32
+ name="persist_directory",
33
+ display_name="Persist Directory",
34
+ ),
35
+ *LCVectorStoreComponent.inputs,
36
+ HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
37
+ StrInput(
38
+ name="chroma_server_cors_allow_origins",
39
+ display_name="Server CORS Allow Origins",
40
+ advanced=True,
41
+ ),
42
+ StrInput(
43
+ name="chroma_server_host",
44
+ display_name="Server Host",
45
+ advanced=True,
46
+ ),
47
+ IntInput(
48
+ name="chroma_server_http_port",
49
+ display_name="Server HTTP Port",
50
+ advanced=True,
51
+ ),
52
+ IntInput(
53
+ name="chroma_server_grpc_port",
54
+ display_name="Server gRPC Port",
55
+ advanced=True,
56
+ ),
57
+ BoolInput(
58
+ name="chroma_server_ssl_enabled",
59
+ display_name="Server SSL Enabled",
60
+ advanced=True,
61
+ ),
62
+ BoolInput(
63
+ name="allow_duplicates",
64
+ display_name="Allow Duplicates",
65
+ advanced=True,
66
+ info="If false, will not add documents that are already in the Vector Store.",
67
+ ),
68
+ DropdownInput(
69
+ name="search_type",
70
+ display_name="Search Type",
71
+ options=["Similarity", "MMR"],
72
+ value="Similarity",
73
+ advanced=True,
74
+ ),
75
+ IntInput(
76
+ name="number_of_results",
77
+ display_name="Number of Results",
78
+ info="Number of results to return.",
79
+ advanced=True,
80
+ value=10,
81
+ ),
82
+ IntInput(
83
+ name="limit",
84
+ display_name="Limit",
85
+ advanced=True,
86
+ info="Limit the number of records to compare when Allow Duplicates is False.",
87
+ ),
88
+ ]
89
+
90
+ @override
91
+ @check_cached_vector_store
92
+ def build_vector_store(self) -> Chroma:
93
+ """Builds the Chroma object."""
94
+ try:
95
+ from chromadb import Client
96
+ from langchain_chroma import Chroma
97
+ except ImportError as e:
98
+ msg = "Could not import Chroma integration package. Please install it with `pip install langchain-chroma`."
99
+ raise ImportError(msg) from e
100
+ # Chroma settings
101
+ chroma_settings = None
102
+ client = None
103
+ if self.chroma_server_host:
104
+ chroma_settings = Settings(
105
+ chroma_server_cors_allow_origins=self.chroma_server_cors_allow_origins or [],
106
+ chroma_server_host=self.chroma_server_host,
107
+ chroma_server_http_port=self.chroma_server_http_port or None,
108
+ chroma_server_grpc_port=self.chroma_server_grpc_port or None,
109
+ chroma_server_ssl_enabled=self.chroma_server_ssl_enabled,
110
+ )
111
+ client = Client(settings=chroma_settings)
112
+
113
+ # Check persist_directory and expand it if it is a relative path
114
+ persist_directory = self.resolve_path(self.persist_directory) if self.persist_directory is not None else None
115
+
116
+ chroma = Chroma(
117
+ persist_directory=persist_directory,
118
+ client=client,
119
+ embedding_function=self.embedding,
120
+ collection_name=self.collection_name,
121
+ )
122
+
123
+ self._add_documents_to_vector_store(chroma)
124
+ self.status = chroma_collection_to_data(chroma.get(limit=self.limit))
125
+ return chroma
126
+
127
+ def _add_documents_to_vector_store(self, vector_store: "Chroma") -> None:
128
+ """Adds documents to the Vector Store."""
129
+ ingest_data: list | Data | DataFrame = self.ingest_data
130
+ if not ingest_data:
131
+ self.status = ""
132
+ return
133
+
134
+ # Convert DataFrame to Data if needed using parent's method
135
+ ingest_data = self._prepare_ingest_data()
136
+
137
+ stored_documents_without_id = []
138
+ if self.allow_duplicates:
139
+ stored_data = []
140
+ else:
141
+ stored_data = chroma_collection_to_data(vector_store.get(limit=self.limit))
142
+ for value in deepcopy(stored_data):
143
+ del value.id
144
+ stored_documents_without_id.append(value)
145
+
146
+ documents = []
147
+ for _input in ingest_data or []:
148
+ if isinstance(_input, Data):
149
+ if _input not in stored_documents_without_id:
150
+ documents.append(_input.to_lc_document())
151
+ else:
152
+ msg = "Vector Store Inputs must be Data objects."
153
+ raise TypeError(msg)
154
+
155
+ if documents and self.embedding is not None:
156
+ self.log(f"Adding {len(documents)} documents to the Vector Store.")
157
+ # Filter complex metadata to prevent ChromaDB errors
158
+ try:
159
+ from langchain_community.vectorstores.utils import filter_complex_metadata
160
+
161
+ filtered_documents = filter_complex_metadata(documents)
162
+ vector_store.add_documents(filtered_documents)
163
+ except ImportError:
164
+ self.log("Warning: Could not import filter_complex_metadata. Adding documents without filtering.")
165
+ vector_store.add_documents(documents)
166
+ else:
167
+ self.log("No documents to add to the Vector Store.")
@@ -0,0 +1,40 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING, Any
4
+
5
+ from lfx.components._importing import import_mod
6
+
7
+ if TYPE_CHECKING:
8
+ from .cleanlab_evaluator import CleanlabEvaluator
9
+ from .cleanlab_rag_evaluator import CleanlabRAGEvaluator
10
+ from .cleanlab_remediator import CleanlabRemediator
11
+
12
+ _dynamic_imports = {
13
+ "CleanlabEvaluator": "cleanlab_evaluator",
14
+ "CleanlabRAGEvaluator": "cleanlab_rag_evaluator",
15
+ "CleanlabRemediator": "cleanlab_remediator",
16
+ }
17
+
18
+ __all__ = [
19
+ "CleanlabEvaluator",
20
+ "CleanlabRAGEvaluator",
21
+ "CleanlabRemediator",
22
+ ]
23
+
24
+
25
+ def __getattr__(attr_name: str) -> Any:
26
+ """Lazily import cleanlab components on attribute access."""
27
+ if attr_name not in _dynamic_imports:
28
+ msg = f"module '{__name__}' has no attribute '{attr_name}'"
29
+ raise AttributeError(msg)
30
+ try:
31
+ result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
32
+ except (ModuleNotFoundError, ImportError, AttributeError) as e:
33
+ msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
34
+ raise AttributeError(msg) from e
35
+ globals()[attr_name] = result
36
+ return result
37
+
38
+
39
+ def __dir__() -> list[str]:
40
+ return list(__all__)
@@ -0,0 +1,155 @@
1
+ from cleanlab_tlm import TLM
2
+
3
+ from lfx.custom import Component
4
+ from lfx.io import (
5
+ DropdownInput,
6
+ MessageTextInput,
7
+ Output,
8
+ SecretStrInput,
9
+ )
10
+ from lfx.schema.message import Message
11
+
12
+
13
+ class CleanlabEvaluator(Component):
14
+ """A component that evaluates the trustworthiness of LLM responses using Cleanlab.
15
+
16
+ This component takes a prompt and response pair, along with optional system instructions,
17
+ and uses Cleanlab's evaluation algorithms to generate a trust score and explanation.
18
+
19
+ Inputs:
20
+ - system_prompt (MessageTextInput): Optional system-level instructions prepended to the user prompt.
21
+ - prompt (MessageTextInput): The user's prompt or query sent to the LLM.
22
+ - response (MessageTextInput): The response generated by the LLM to be evaluated. This should come from the
23
+ LLM component, i.e. OpenAI, Gemini, etc.
24
+ - api_key (SecretStrInput): Your Cleanlab API key.
25
+ - model (DropdownInput): The model used by Cleanlab to evaluate the response (can differ from the
26
+ generation model).
27
+ - quality_preset (DropdownInput): Tradeoff setting for accuracy vs. speed and cost. Higher presets are
28
+ slower but more accurate.
29
+
30
+ Outputs:
31
+ - response_passthrough (Message): The original response, passed through for downstream use.
32
+ - score (number): A float between 0 and 1 indicating Cleanlab's trustworthiness score for the response.
33
+ - explanation (Message): A textual explanation of why the response received its score.
34
+
35
+ This component works well in conjunction with the CleanlabRemediator to create a complete trust evaluation
36
+ and remediation pipeline.
37
+
38
+ More details on the evaluation metrics can be found here: https://help.cleanlab.ai/tlm/tutorials/tlm/
39
+ """
40
+
41
+ display_name = "Cleanlab Evaluator"
42
+ description = "Evaluates any LLM response using Cleanlab and outputs trust score and explanation."
43
+ icon = "Cleanlab"
44
+ name = "CleanlabEvaluator"
45
+
46
+ inputs = [
47
+ MessageTextInput(
48
+ name="system_prompt",
49
+ display_name="System Message",
50
+ info="System-level instructions prepended to the user query.",
51
+ value="",
52
+ ),
53
+ MessageTextInput(
54
+ name="prompt",
55
+ display_name="Prompt",
56
+ info="The user's query to the model.",
57
+ required=True,
58
+ ),
59
+ MessageTextInput(
60
+ name="response",
61
+ display_name="Response",
62
+ info="The response to the user's query.",
63
+ required=True,
64
+ ),
65
+ SecretStrInput(
66
+ name="api_key",
67
+ display_name="Cleanlab API Key",
68
+ info="Your Cleanlab API key.",
69
+ required=True,
70
+ ),
71
+ DropdownInput(
72
+ name="model",
73
+ display_name="Cleanlab Evaluation Model",
74
+ options=[
75
+ "gpt-4.1",
76
+ "gpt-4.1-mini",
77
+ "gpt-4.1-nano",
78
+ "o4-mini",
79
+ "o3",
80
+ "gpt-4.5-preview",
81
+ "gpt-4o-mini",
82
+ "gpt-4o",
83
+ "o3-mini",
84
+ "o1",
85
+ "o1-mini",
86
+ "gpt-4",
87
+ "gpt-3.5-turbo-16k",
88
+ "claude-3.7-sonnet",
89
+ "claude-3.5-sonnet-v2",
90
+ "claude-3.5-sonnet",
91
+ "claude-3.5-haiku",
92
+ "claude-3-haiku",
93
+ "nova-micro",
94
+ "nova-lite",
95
+ "nova-pro",
96
+ ],
97
+ info="The model Cleanlab uses to evaluate the response. This does NOT need to be the same model that "
98
+ "generated the response.",
99
+ value="gpt-4o-mini",
100
+ required=True,
101
+ advanced=True,
102
+ ),
103
+ DropdownInput(
104
+ name="quality_preset",
105
+ display_name="Quality Preset",
106
+ options=["base", "low", "medium", "high", "best"],
107
+ value="medium",
108
+ info="This determines the accuracy, latency, and cost of the evaluation. Higher quality is generally "
109
+ "slower but more accurate.",
110
+ required=True,
111
+ advanced=True,
112
+ ),
113
+ ]
114
+
115
+ outputs = [
116
+ Output(
117
+ display_name="Response",
118
+ name="response_passthrough",
119
+ method="pass_response",
120
+ types=["Message"],
121
+ ),
122
+ Output(display_name="Trust Score", name="score", method="get_score", types=["number"]),
123
+ Output(
124
+ display_name="Explanation",
125
+ name="explanation",
126
+ method="get_explanation",
127
+ types=["Message"],
128
+ ),
129
+ ]
130
+
131
+ def _evaluate_once(self):
132
+ if not hasattr(self, "_cached_result"):
133
+ full_prompt = f"{self.system_prompt}\n\n{self.prompt}" if self.system_prompt else self.prompt
134
+ tlm = TLM(
135
+ api_key=self.api_key,
136
+ options={"log": ["explanation"], "model": self.model},
137
+ quality_preset=self.quality_preset,
138
+ )
139
+ self._cached_result = tlm.get_trustworthiness_score(full_prompt, self.response)
140
+ return self._cached_result
141
+
142
+ def get_score(self) -> float:
143
+ result = self._evaluate_once()
144
+ score = result.get("trustworthiness_score", 0.0)
145
+ self.status = f"Trust score: {score:.2f}"
146
+ return score
147
+
148
+ def get_explanation(self) -> Message:
149
+ result = self._evaluate_once()
150
+ explanation = result.get("log", {}).get("explanation", "No explanation returned.")
151
+ return Message(text=explanation)
152
+
153
+ def pass_response(self) -> Message:
154
+ self.status = "Passing through response."
155
+ return Message(text=self.response)
@@ -0,0 +1,254 @@
1
+ from cleanlab_tlm import TrustworthyRAG, get_default_evals
2
+
3
+ from lfx.custom import Component
4
+ from lfx.io import (
5
+ BoolInput,
6
+ DropdownInput,
7
+ MessageTextInput,
8
+ Output,
9
+ SecretStrInput,
10
+ )
11
+ from lfx.schema.message import Message
12
+
13
+
14
+ class CleanlabRAGEvaluator(Component):
15
+ """A component that evaluates the quality of RAG (Retrieval-Augmented Generation) outputs using Cleanlab.
16
+
17
+ This component takes a query, retrieved context, and generated response from a RAG pipeline,
18
+ and uses Cleanlab's evaluation algorithms to assess various aspects of the RAG system's performance.
19
+
20
+ The component can evaluate:
21
+ - Overall trustworthiness of the LLM generated response
22
+ - Context sufficiency (whether the retrieved context contains information needed to answer the query)
23
+ - Response groundedness (whether the response is supported directly by the context)
24
+ - Response helpfulness (whether the response effectively addresses the user's query)
25
+ - Query ease (whether the user query seems easy for an AI system to properly handle, useful to diagnose
26
+ queries that are: complex, vague, tricky, or disgruntled-sounding)
27
+
28
+ Outputs:
29
+ - Trust Score: A score between 0-1 corresponding to the trustworthiness of the response. A higher score
30
+ indicates a higher confidence that the response is correct/good.
31
+ - Explanation: An LLM generated explanation of the trustworthiness assessment
32
+ - Other Evals: Additional evaluation metrics for selected evaluation types in the "Controls" tab
33
+ - Evaluation Summary: A comprehensive summary of context, query, response, and selected evaluation results
34
+
35
+ This component works well in conjunction with the CleanlabRemediator to create a complete trust evaluation
36
+ and remediation pipeline.
37
+
38
+ More details on the evaluation metrics can be found here: https://help.cleanlab.ai/tlm/use-cases/tlm_rag/
39
+ """
40
+
41
+ display_name = "Cleanlab RAG Evaluator"
42
+ description = "Evaluates context, query, and response from a RAG pipeline using Cleanlab and outputs trust metrics."
43
+ icon = "Cleanlab"
44
+ name = "CleanlabRAGEvaluator"
45
+
46
+ inputs = [
47
+ SecretStrInput(
48
+ name="api_key",
49
+ display_name="Cleanlab API Key",
50
+ info="Your Cleanlab API key.",
51
+ required=True,
52
+ ),
53
+ DropdownInput(
54
+ name="model",
55
+ display_name="Cleanlab Evaluation Model",
56
+ options=[
57
+ "gpt-4.1",
58
+ "gpt-4.1-mini",
59
+ "gpt-4.1-nano",
60
+ "o4-mini",
61
+ "o3",
62
+ "gpt-4.5-preview",
63
+ "gpt-4o-mini",
64
+ "gpt-4o",
65
+ "o3-mini",
66
+ "o1",
67
+ "o1-mini",
68
+ "gpt-4",
69
+ "gpt-3.5-turbo-16k",
70
+ "claude-3.7-sonnet",
71
+ "claude-3.5-sonnet-v2",
72
+ "claude-3.5-sonnet",
73
+ "claude-3.5-haiku",
74
+ "claude-3-haiku",
75
+ "nova-micro",
76
+ "nova-lite",
77
+ "nova-pro",
78
+ ],
79
+ info="The model Cleanlab uses to evaluate the context, query, and response. This does NOT need to be "
80
+ "the same model that generated the response.",
81
+ value="gpt-4o-mini",
82
+ required=True,
83
+ advanced=True,
84
+ ),
85
+ DropdownInput(
86
+ name="quality_preset",
87
+ display_name="Quality Preset",
88
+ options=["base", "low", "medium"],
89
+ value="medium",
90
+ info="This determines the accuracy, latency, and cost of the evaluation. Higher quality is generally "
91
+ "slower but more accurate.",
92
+ required=True,
93
+ advanced=True,
94
+ ),
95
+ MessageTextInput(
96
+ name="context",
97
+ display_name="Context",
98
+ info="The context retrieved for the given query.",
99
+ required=True,
100
+ ),
101
+ MessageTextInput(
102
+ name="query",
103
+ display_name="Query",
104
+ info="The user's query.",
105
+ required=True,
106
+ ),
107
+ MessageTextInput(
108
+ name="response",
109
+ display_name="Response",
110
+ info="The response generated by the LLM.",
111
+ required=True,
112
+ ),
113
+ BoolInput(
114
+ name="run_context_sufficiency",
115
+ display_name="Run Context Sufficiency",
116
+ value=False,
117
+ advanced=True,
118
+ ),
119
+ BoolInput(
120
+ name="run_response_groundedness",
121
+ display_name="Run Response Groundedness",
122
+ value=False,
123
+ advanced=True,
124
+ ),
125
+ BoolInput(
126
+ name="run_response_helpfulness",
127
+ display_name="Run Response Helpfulness",
128
+ value=False,
129
+ advanced=True,
130
+ ),
131
+ BoolInput(
132
+ name="run_query_ease",
133
+ display_name="Run Query Ease",
134
+ value=False,
135
+ advanced=True,
136
+ ),
137
+ ]
138
+
139
+ outputs = [
140
+ Output(display_name="Response", name="response_passthrough", method="pass_response", types=["Message"]),
141
+ Output(display_name="Trust Score", name="trust_score", method="get_trust_score", types=["number"]),
142
+ Output(display_name="Explanation", name="trust_explanation", method="get_trust_explanation", types=["Message"]),
143
+ Output(display_name="Other Evals", name="other_scores", method="get_other_scores", types=["Data"]),
144
+ Output(
145
+ display_name="Evaluation Summary",
146
+ name="evaluation_summary",
147
+ method="get_evaluation_summary",
148
+ types=["Message"],
149
+ ),
150
+ ]
151
+
152
+ def _evaluate_once(self):
153
+ if not hasattr(self, "_cached_result"):
154
+ try:
155
+ self.status = "Configuring selected evals..."
156
+ default_evals = get_default_evals()
157
+ enabled_names = []
158
+ if self.run_context_sufficiency:
159
+ enabled_names.append("context_sufficiency")
160
+ if self.run_response_groundedness:
161
+ enabled_names.append("response_groundedness")
162
+ if self.run_response_helpfulness:
163
+ enabled_names.append("response_helpfulness")
164
+ if self.run_query_ease:
165
+ enabled_names.append("query_ease")
166
+
167
+ selected_evals = [e for e in default_evals if e.name in enabled_names]
168
+
169
+ validator = TrustworthyRAG(
170
+ api_key=self.api_key,
171
+ quality_preset=self.quality_preset,
172
+ options={"log": ["explanation"], "model": self.model},
173
+ evals=selected_evals,
174
+ )
175
+
176
+ self.status = f"Running evals: {[e.name for e in selected_evals]}"
177
+ self._cached_result = validator.score(
178
+ query=self.query,
179
+ context=self.context,
180
+ response=self.response,
181
+ )
182
+ self.status = "Evaluation complete."
183
+
184
+ except Exception as e: # noqa: BLE001
185
+ self.status = f"Evaluation failed: {e!s}"
186
+ self._cached_result = {}
187
+ return self._cached_result
188
+
189
+ def pass_response(self) -> Message:
190
+ self.status = "Passing through response."
191
+ return Message(text=self.response)
192
+
193
+ def get_trust_score(self) -> float:
194
+ score = self._evaluate_once().get("trustworthiness", {}).get("score", 0.0)
195
+ self.status = f"Trust Score: {score:.3f}"
196
+ return score
197
+
198
+ def get_trust_explanation(self) -> Message:
199
+ explanation = self._evaluate_once().get("trustworthiness", {}).get("log", {}).get("explanation", "")
200
+ self.status = "Trust explanation extracted."
201
+ return Message(text=explanation)
202
+
203
+ def get_other_scores(self) -> dict:
204
+ result = self._evaluate_once()
205
+
206
+ selected = {
207
+ "context_sufficiency": self.run_context_sufficiency,
208
+ "response_groundedness": self.run_response_groundedness,
209
+ "response_helpfulness": self.run_response_helpfulness,
210
+ "query_ease": self.run_query_ease,
211
+ }
212
+
213
+ filtered_scores = {key: result[key]["score"] for key, include in selected.items() if include and key in result}
214
+
215
+ self.status = f"{len(filtered_scores)} other evals returned."
216
+ return filtered_scores
217
+
218
+ def get_evaluation_summary(self) -> Message:
219
+ result = self._evaluate_once()
220
+
221
+ query_text = self.query.strip()
222
+ context_text = self.context.strip()
223
+ response_text = self.response.strip()
224
+
225
+ trust = result.get("trustworthiness", {}).get("score", 0.0)
226
+ trust_exp = result.get("trustworthiness", {}).get("log", {}).get("explanation", "")
227
+
228
+ selected = {
229
+ "context_sufficiency": self.run_context_sufficiency,
230
+ "response_groundedness": self.run_response_groundedness,
231
+ "response_helpfulness": self.run_response_helpfulness,
232
+ "query_ease": self.run_query_ease,
233
+ }
234
+
235
+ other_scores = {key: result[key]["score"] for key, include in selected.items() if include and key in result}
236
+
237
+ metrics = f"Trustworthiness: {trust:.3f}"
238
+ if trust_exp:
239
+ metrics += f"\nExplanation: {trust_exp}"
240
+ if other_scores:
241
+ metrics += "\n" + "\n".join(f"{k.replace('_', ' ').title()}: {v:.3f}" for k, v in other_scores.items())
242
+
243
+ summary = (
244
+ f"Query:\n{query_text}\n"
245
+ "-----\n"
246
+ f"Context:\n{context_text}\n"
247
+ "-----\n"
248
+ f"Response:\n{response_text}\n"
249
+ "------------------------------\n"
250
+ f"{metrics}"
251
+ )
252
+
253
+ self.status = "Evaluation summary built."
254
+ return Message(text=summary)