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.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +268 -0
- lfx/base/agents/callback.py +130 -0
- lfx/base/agents/context.py +109 -0
- lfx/base/agents/crewai/__init__.py +0 -0
- lfx/base/agents/crewai/crew.py +231 -0
- lfx/base/agents/crewai/tasks.py +12 -0
- lfx/base/agents/default_prompts.py +23 -0
- lfx/base/agents/errors.py +15 -0
- lfx/base/agents/events.py +346 -0
- lfx/base/agents/utils.py +205 -0
- lfx/base/astra_assistants/__init__.py +0 -0
- lfx/base/astra_assistants/util.py +171 -0
- lfx/base/chains/__init__.py +0 -0
- lfx/base/chains/model.py +19 -0
- lfx/base/composio/__init__.py +0 -0
- lfx/base/composio/composio_base.py +1291 -0
- lfx/base/compressors/__init__.py +0 -0
- lfx/base/compressors/model.py +60 -0
- lfx/base/constants.py +46 -0
- lfx/base/curl/__init__.py +0 -0
- lfx/base/curl/parse.py +188 -0
- lfx/base/data/__init__.py +5 -0
- lfx/base/data/base_file.py +685 -0
- lfx/base/data/docling_utils.py +245 -0
- lfx/base/data/utils.py +198 -0
- lfx/base/document_transformers/__init__.py +0 -0
- lfx/base/document_transformers/model.py +43 -0
- lfx/base/embeddings/__init__.py +0 -0
- lfx/base/embeddings/aiml_embeddings.py +62 -0
- lfx/base/embeddings/model.py +26 -0
- lfx/base/flow_processing/__init__.py +0 -0
- lfx/base/flow_processing/utils.py +86 -0
- lfx/base/huggingface/__init__.py +0 -0
- lfx/base/huggingface/model_bridge.py +133 -0
- lfx/base/io/__init__.py +0 -0
- lfx/base/io/chat.py +20 -0
- lfx/base/io/text.py +22 -0
- lfx/base/langchain_utilities/__init__.py +0 -0
- lfx/base/langchain_utilities/model.py +35 -0
- lfx/base/langchain_utilities/spider_constants.py +1 -0
- lfx/base/langwatch/__init__.py +0 -0
- lfx/base/langwatch/utils.py +18 -0
- lfx/base/mcp/__init__.py +0 -0
- lfx/base/mcp/constants.py +2 -0
- lfx/base/mcp/util.py +1398 -0
- lfx/base/memory/__init__.py +0 -0
- lfx/base/memory/memory.py +49 -0
- lfx/base/memory/model.py +38 -0
- lfx/base/models/__init__.py +3 -0
- lfx/base/models/aiml_constants.py +51 -0
- lfx/base/models/anthropic_constants.py +47 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/groq_constants.py +134 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +307 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +8 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +49 -0
- lfx/base/models/openai_constants.py +122 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/processing/__init__.py +0 -0
- lfx/base/prompts/__init__.py +0 -0
- lfx/base/prompts/api_utils.py +224 -0
- lfx/base/prompts/utils.py +61 -0
- lfx/base/textsplitters/__init__.py +0 -0
- lfx/base/textsplitters/model.py +28 -0
- lfx/base/tools/__init__.py +0 -0
- lfx/base/tools/base.py +26 -0
- lfx/base/tools/component_tool.py +325 -0
- lfx/base/tools/constants.py +49 -0
- lfx/base/tools/flow_tool.py +132 -0
- lfx/base/tools/run_flow.py +224 -0
- lfx/base/vectorstores/__init__.py +0 -0
- lfx/base/vectorstores/model.py +193 -0
- lfx/base/vectorstores/utils.py +22 -0
- lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
- lfx/cli/__init__.py +5 -0
- lfx/cli/commands.py +319 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +441 -0
- lfx/cli/script_loader.py +247 -0
- lfx/cli/serve_app.py +546 -0
- lfx/cli/validation.py +69 -0
- lfx/components/FAISS/__init__.py +34 -0
- lfx/components/FAISS/faiss.py +111 -0
- lfx/components/Notion/__init__.py +19 -0
- lfx/components/Notion/add_content_to_page.py +269 -0
- lfx/components/Notion/create_page.py +94 -0
- lfx/components/Notion/list_database_properties.py +68 -0
- lfx/components/Notion/list_pages.py +122 -0
- lfx/components/Notion/list_users.py +77 -0
- lfx/components/Notion/page_content_viewer.py +93 -0
- lfx/components/Notion/search.py +111 -0
- lfx/components/Notion/update_page_property.py +114 -0
- lfx/components/__init__.py +411 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/agents/__init__.py +34 -0
- lfx/components/agents/agent.py +558 -0
- lfx/components/agents/mcp_component.py +501 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +112 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +124 -0
- lfx/components/amazon/s3_bucket_uploader.py +211 -0
- lfx/components/anthropic/__init__.py +34 -0
- lfx/components/anthropic/anthropic.py +187 -0
- lfx/components/apify/__init__.py +5 -0
- lfx/components/apify/apify_actor.py +325 -0
- lfx/components/arxiv/__init__.py +3 -0
- lfx/components/arxiv/arxiv.py +163 -0
- lfx/components/assemblyai/__init__.py +46 -0
- lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- lfx/components/assemblyai/assemblyai_lemur.py +183 -0
- lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
- lfx/components/azure/__init__.py +37 -0
- lfx/components/azure/azure_openai.py +95 -0
- lfx/components/azure/azure_openai_embeddings.py +83 -0
- lfx/components/baidu/__init__.py +32 -0
- lfx/components/baidu/baidu_qianfan_chat.py +113 -0
- lfx/components/bing/__init__.py +3 -0
- lfx/components/bing/bing_search_api.py +61 -0
- lfx/components/cassandra/__init__.py +40 -0
- lfx/components/cassandra/cassandra.py +264 -0
- lfx/components/cassandra/cassandra_chat.py +92 -0
- lfx/components/cassandra/cassandra_graph.py +238 -0
- lfx/components/chains/__init__.py +3 -0
- lfx/components/chroma/__init__.py +34 -0
- lfx/components/chroma/chroma.py +167 -0
- lfx/components/cleanlab/__init__.py +40 -0
- lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
- lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- lfx/components/cleanlab/cleanlab_remediator.py +131 -0
- lfx/components/clickhouse/__init__.py +34 -0
- lfx/components/clickhouse/clickhouse.py +135 -0
- lfx/components/cloudflare/__init__.py +32 -0
- lfx/components/cloudflare/cloudflare.py +81 -0
- lfx/components/cohere/__init__.py +40 -0
- lfx/components/cohere/cohere_embeddings.py +81 -0
- lfx/components/cohere/cohere_models.py +46 -0
- lfx/components/cohere/cohere_rerank.py +51 -0
- lfx/components/composio/__init__.py +74 -0
- lfx/components/composio/composio_api.py +268 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/slack_composio.py +582 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/youtube_composio.py +11 -0
- lfx/components/confluence/__init__.py +3 -0
- lfx/components/confluence/confluence.py +84 -0
- lfx/components/couchbase/__init__.py +34 -0
- lfx/components/couchbase/couchbase.py +102 -0
- lfx/components/crewai/__init__.py +49 -0
- lfx/components/crewai/crewai.py +107 -0
- lfx/components/crewai/hierarchical_crew.py +46 -0
- lfx/components/crewai/hierarchical_task.py +44 -0
- lfx/components/crewai/sequential_crew.py +52 -0
- lfx/components/crewai/sequential_task.py +73 -0
- lfx/components/crewai/sequential_task_agent.py +143 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +64 -0
- lfx/components/data/api_request.py +544 -0
- lfx/components/data/csv_to_data.py +95 -0
- lfx/components/data/directory.py +113 -0
- lfx/components/data/file.py +577 -0
- lfx/components/data/json_to_data.py +98 -0
- lfx/components/data/news_search.py +164 -0
- lfx/components/data/rss.py +69 -0
- lfx/components/data/sql_executor.py +101 -0
- lfx/components/data/url.py +311 -0
- lfx/components/data/web_search.py +112 -0
- lfx/components/data/webhook.py +56 -0
- lfx/components/datastax/__init__.py +70 -0
- lfx/components/datastax/astra_assistant_manager.py +306 -0
- lfx/components/datastax/astra_db.py +75 -0
- lfx/components/datastax/astra_vectorize.py +124 -0
- lfx/components/datastax/astradb.py +1285 -0
- lfx/components/datastax/astradb_cql.py +314 -0
- lfx/components/datastax/astradb_graph.py +330 -0
- lfx/components/datastax/astradb_tool.py +414 -0
- lfx/components/datastax/astradb_vectorstore.py +1285 -0
- lfx/components/datastax/cassandra.py +92 -0
- lfx/components/datastax/create_assistant.py +58 -0
- lfx/components/datastax/create_thread.py +32 -0
- lfx/components/datastax/dotenv.py +35 -0
- lfx/components/datastax/get_assistant.py +37 -0
- lfx/components/datastax/getenvvar.py +30 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +314 -0
- lfx/components/datastax/list_assistants.py +25 -0
- lfx/components/datastax/run.py +89 -0
- lfx/components/deactivated/__init__.py +15 -0
- lfx/components/deactivated/amazon_kendra.py +66 -0
- lfx/components/deactivated/chat_litellm_model.py +158 -0
- lfx/components/deactivated/code_block_extractor.py +26 -0
- lfx/components/deactivated/documents_to_data.py +22 -0
- lfx/components/deactivated/embed.py +16 -0
- lfx/components/deactivated/extract_key_from_data.py +46 -0
- lfx/components/deactivated/json_document_builder.py +57 -0
- lfx/components/deactivated/list_flows.py +20 -0
- lfx/components/deactivated/mcp_sse.py +61 -0
- lfx/components/deactivated/mcp_stdio.py +62 -0
- lfx/components/deactivated/merge_data.py +93 -0
- lfx/components/deactivated/message.py +37 -0
- lfx/components/deactivated/metal.py +54 -0
- lfx/components/deactivated/multi_query.py +59 -0
- lfx/components/deactivated/retriever.py +43 -0
- lfx/components/deactivated/selective_passthrough.py +77 -0
- lfx/components/deactivated/should_run_next.py +40 -0
- lfx/components/deactivated/split_text.py +63 -0
- lfx/components/deactivated/store_message.py +24 -0
- lfx/components/deactivated/sub_flow.py +124 -0
- lfx/components/deactivated/vectara_self_query.py +76 -0
- lfx/components/deactivated/vector_store.py +24 -0
- lfx/components/deepseek/__init__.py +34 -0
- lfx/components/deepseek/deepseek.py +136 -0
- lfx/components/docling/__init__.py +43 -0
- lfx/components/docling/chunk_docling_document.py +186 -0
- lfx/components/docling/docling_inline.py +231 -0
- lfx/components/docling/docling_remote.py +193 -0
- lfx/components/docling/export_docling_document.py +117 -0
- lfx/components/documentloaders/__init__.py +3 -0
- lfx/components/duckduckgo/__init__.py +3 -0
- lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- lfx/components/elastic/__init__.py +37 -0
- lfx/components/elastic/elasticsearch.py +267 -0
- lfx/components/elastic/opensearch.py +243 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +76 -0
- lfx/components/embeddings/text_embedder.py +64 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/firecrawl/__init__.py +43 -0
- lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
- lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
- lfx/components/firecrawl/firecrawl_map_api.py +89 -0
- lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
- lfx/components/git/__init__.py +4 -0
- lfx/components/git/git.py +262 -0
- lfx/components/git/gitextractor.py +196 -0
- lfx/components/glean/__init__.py +3 -0
- lfx/components/glean/glean_search_api.py +173 -0
- lfx/components/google/__init__.py +17 -0
- lfx/components/google/gmail.py +192 -0
- lfx/components/google/google_bq_sql_executor.py +157 -0
- lfx/components/google/google_drive.py +92 -0
- lfx/components/google/google_drive_search.py +152 -0
- lfx/components/google/google_generative_ai.py +147 -0
- lfx/components/google/google_generative_ai_embeddings.py +141 -0
- lfx/components/google/google_oauth_token.py +89 -0
- lfx/components/google/google_search_api_core.py +68 -0
- lfx/components/google/google_serper_api_core.py +74 -0
- lfx/components/groq/__init__.py +34 -0
- lfx/components/groq/groq.py +136 -0
- lfx/components/helpers/__init__.py +52 -0
- lfx/components/helpers/calculator_core.py +89 -0
- lfx/components/helpers/create_list.py +40 -0
- lfx/components/helpers/current_date.py +42 -0
- lfx/components/helpers/id_generator.py +42 -0
- lfx/components/helpers/memory.py +251 -0
- lfx/components/helpers/output_parser.py +45 -0
- lfx/components/helpers/store_message.py +90 -0
- lfx/components/homeassistant/__init__.py +7 -0
- lfx/components/homeassistant/home_assistant_control.py +152 -0
- lfx/components/homeassistant/list_home_assistant_states.py +137 -0
- lfx/components/huggingface/__init__.py +37 -0
- lfx/components/huggingface/huggingface.py +197 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +203 -0
- lfx/components/ibm/watsonx_embeddings.py +135 -0
- lfx/components/icosacomputing/__init__.py +5 -0
- lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
- lfx/components/input_output/__init__.py +38 -0
- lfx/components/input_output/chat.py +120 -0
- lfx/components/input_output/chat_output.py +200 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/jigsawstack/__init__.py +23 -0
- lfx/components/jigsawstack/ai_scrape.py +126 -0
- lfx/components/jigsawstack/ai_web_search.py +136 -0
- lfx/components/jigsawstack/file_read.py +115 -0
- lfx/components/jigsawstack/file_upload.py +94 -0
- lfx/components/jigsawstack/image_generation.py +205 -0
- lfx/components/jigsawstack/nsfw.py +60 -0
- lfx/components/jigsawstack/object_detection.py +124 -0
- lfx/components/jigsawstack/sentiment.py +112 -0
- lfx/components/jigsawstack/text_to_sql.py +90 -0
- lfx/components/jigsawstack/text_translate.py +77 -0
- lfx/components/jigsawstack/vocr.py +107 -0
- lfx/components/langchain_utilities/__init__.py +109 -0
- lfx/components/langchain_utilities/character.py +53 -0
- lfx/components/langchain_utilities/conversation.py +59 -0
- lfx/components/langchain_utilities/csv_agent.py +107 -0
- lfx/components/langchain_utilities/fake_embeddings.py +26 -0
- lfx/components/langchain_utilities/html_link_extractor.py +35 -0
- lfx/components/langchain_utilities/json_agent.py +45 -0
- lfx/components/langchain_utilities/langchain_hub.py +126 -0
- lfx/components/langchain_utilities/language_recursive.py +49 -0
- lfx/components/langchain_utilities/language_semantic.py +138 -0
- lfx/components/langchain_utilities/llm_checker.py +39 -0
- lfx/components/langchain_utilities/llm_math.py +42 -0
- lfx/components/langchain_utilities/natural_language.py +61 -0
- lfx/components/langchain_utilities/openai_tools.py +53 -0
- lfx/components/langchain_utilities/openapi.py +48 -0
- lfx/components/langchain_utilities/recursive_character.py +60 -0
- lfx/components/langchain_utilities/retrieval_qa.py +83 -0
- lfx/components/langchain_utilities/runnable_executor.py +137 -0
- lfx/components/langchain_utilities/self_query.py +80 -0
- lfx/components/langchain_utilities/spider.py +142 -0
- lfx/components/langchain_utilities/sql.py +40 -0
- lfx/components/langchain_utilities/sql_database.py +35 -0
- lfx/components/langchain_utilities/sql_generator.py +78 -0
- lfx/components/langchain_utilities/tool_calling.py +59 -0
- lfx/components/langchain_utilities/vector_store_info.py +49 -0
- lfx/components/langchain_utilities/vector_store_router.py +33 -0
- lfx/components/langchain_utilities/xml_agent.py +71 -0
- lfx/components/langwatch/__init__.py +3 -0
- lfx/components/langwatch/langwatch.py +278 -0
- lfx/components/link_extractors/__init__.py +3 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +129 -0
- lfx/components/logic/__init__.py +52 -0
- lfx/components/logic/conditional_router.py +171 -0
- lfx/components/logic/data_conditional_router.py +125 -0
- lfx/components/logic/flow_tool.py +110 -0
- lfx/components/logic/listen.py +29 -0
- lfx/components/logic/loop.py +125 -0
- lfx/components/logic/notify.py +88 -0
- lfx/components/logic/pass_message.py +35 -0
- lfx/components/logic/run_flow.py +71 -0
- lfx/components/logic/sub_flow.py +114 -0
- lfx/components/maritalk/__init__.py +32 -0
- lfx/components/maritalk/maritalk.py +52 -0
- lfx/components/mem0/__init__.py +3 -0
- lfx/components/mem0/mem0_chat_memory.py +136 -0
- lfx/components/milvus/__init__.py +34 -0
- lfx/components/milvus/milvus.py +115 -0
- lfx/components/mistral/__init__.py +37 -0
- lfx/components/mistral/mistral.py +114 -0
- lfx/components/mistral/mistral_embeddings.py +58 -0
- lfx/components/models/__init__.py +34 -0
- lfx/components/models/embedding_model.py +114 -0
- lfx/components/models/language_model.py +144 -0
- lfx/components/mongodb/__init__.py +34 -0
- lfx/components/mongodb/mongodb_atlas.py +213 -0
- lfx/components/needle/__init__.py +3 -0
- lfx/components/needle/needle.py +104 -0
- lfx/components/notdiamond/__init__.py +34 -0
- lfx/components/notdiamond/notdiamond.py +228 -0
- lfx/components/novita/__init__.py +32 -0
- lfx/components/novita/novita.py +130 -0
- lfx/components/nvidia/__init__.py +57 -0
- lfx/components/nvidia/nvidia.py +157 -0
- lfx/components/nvidia/nvidia_embedding.py +77 -0
- lfx/components/nvidia/nvidia_ingest.py +317 -0
- lfx/components/nvidia/nvidia_rerank.py +63 -0
- lfx/components/nvidia/system_assist.py +65 -0
- lfx/components/olivya/__init__.py +3 -0
- lfx/components/olivya/olivya.py +116 -0
- lfx/components/ollama/__init__.py +37 -0
- lfx/components/ollama/ollama.py +330 -0
- lfx/components/ollama/ollama_embeddings.py +106 -0
- lfx/components/openai/__init__.py +37 -0
- lfx/components/openai/openai.py +100 -0
- lfx/components/openai/openai_chat_model.py +176 -0
- lfx/components/openrouter/__init__.py +32 -0
- lfx/components/openrouter/openrouter.py +202 -0
- lfx/components/output_parsers/__init__.py +3 -0
- lfx/components/perplexity/__init__.py +34 -0
- lfx/components/perplexity/perplexity.py +75 -0
- lfx/components/pgvector/__init__.py +34 -0
- lfx/components/pgvector/pgvector.py +72 -0
- lfx/components/pinecone/__init__.py +34 -0
- lfx/components/pinecone/pinecone.py +134 -0
- lfx/components/processing/__init__.py +117 -0
- lfx/components/processing/alter_metadata.py +108 -0
- lfx/components/processing/batch_run.py +205 -0
- lfx/components/processing/combine_text.py +39 -0
- lfx/components/processing/converter.py +159 -0
- lfx/components/processing/create_data.py +110 -0
- lfx/components/processing/data_operations.py +438 -0
- lfx/components/processing/data_to_dataframe.py +70 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/extract_key.py +53 -0
- lfx/components/processing/filter_data.py +42 -0
- lfx/components/processing/filter_data_values.py +88 -0
- lfx/components/processing/json_cleaner.py +103 -0
- lfx/components/processing/lambda_filter.py +154 -0
- lfx/components/processing/llm_router.py +499 -0
- lfx/components/processing/merge_data.py +90 -0
- lfx/components/processing/message_to_data.py +36 -0
- lfx/components/processing/parse_data.py +70 -0
- lfx/components/processing/parse_dataframe.py +68 -0
- lfx/components/processing/parse_json_data.py +90 -0
- lfx/components/processing/parser.py +143 -0
- lfx/components/processing/prompt.py +67 -0
- lfx/components/processing/python_repl_core.py +98 -0
- lfx/components/processing/regex.py +82 -0
- lfx/components/processing/save_file.py +225 -0
- lfx/components/processing/select_data.py +48 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/structured_output.py +202 -0
- lfx/components/processing/update_data.py +160 -0
- lfx/components/prototypes/__init__.py +34 -0
- lfx/components/prototypes/python_function.py +73 -0
- lfx/components/qdrant/__init__.py +34 -0
- lfx/components/qdrant/qdrant.py +109 -0
- lfx/components/redis/__init__.py +37 -0
- lfx/components/redis/redis.py +89 -0
- lfx/components/redis/redis_chat.py +43 -0
- lfx/components/sambanova/__init__.py +32 -0
- lfx/components/sambanova/sambanova.py +84 -0
- lfx/components/scrapegraph/__init__.py +40 -0
- lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- lfx/components/searchapi/__init__.py +34 -0
- lfx/components/searchapi/search.py +79 -0
- lfx/components/serpapi/__init__.py +3 -0
- lfx/components/serpapi/serp.py +115 -0
- lfx/components/supabase/__init__.py +34 -0
- lfx/components/supabase/supabase.py +76 -0
- lfx/components/tavily/__init__.py +4 -0
- lfx/components/tavily/tavily_extract.py +117 -0
- lfx/components/tavily/tavily_search.py +212 -0
- lfx/components/textsplitters/__init__.py +3 -0
- lfx/components/toolkits/__init__.py +3 -0
- lfx/components/tools/__init__.py +72 -0
- lfx/components/tools/calculator.py +108 -0
- lfx/components/tools/google_search_api.py +45 -0
- lfx/components/tools/google_serper_api.py +115 -0
- lfx/components/tools/python_code_structured_tool.py +327 -0
- lfx/components/tools/python_repl.py +97 -0
- lfx/components/tools/search_api.py +87 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +119 -0
- lfx/components/tools/tavily_search_tool.py +344 -0
- lfx/components/tools/wikidata_api.py +102 -0
- lfx/components/tools/wikipedia_api.py +49 -0
- lfx/components/tools/yahoo_finance.py +129 -0
- lfx/components/twelvelabs/__init__.py +52 -0
- lfx/components/twelvelabs/convert_astra_results.py +84 -0
- lfx/components/twelvelabs/pegasus_index.py +311 -0
- lfx/components/twelvelabs/split_video.py +291 -0
- lfx/components/twelvelabs/text_embeddings.py +57 -0
- lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- lfx/components/twelvelabs/video_embeddings.py +100 -0
- lfx/components/twelvelabs/video_file.py +179 -0
- lfx/components/unstructured/__init__.py +3 -0
- lfx/components/unstructured/unstructured.py +121 -0
- lfx/components/upstash/__init__.py +34 -0
- lfx/components/upstash/upstash.py +124 -0
- lfx/components/vectara/__init__.py +37 -0
- lfx/components/vectara/vectara.py +97 -0
- lfx/components/vectara/vectara_rag.py +164 -0
- lfx/components/vectorstores/__init__.py +40 -0
- lfx/components/vectorstores/astradb.py +1285 -0
- lfx/components/vectorstores/astradb_graph.py +319 -0
- lfx/components/vectorstores/cassandra.py +264 -0
- lfx/components/vectorstores/cassandra_graph.py +238 -0
- lfx/components/vectorstores/chroma.py +167 -0
- lfx/components/vectorstores/clickhouse.py +135 -0
- lfx/components/vectorstores/couchbase.py +102 -0
- lfx/components/vectorstores/elasticsearch.py +267 -0
- lfx/components/vectorstores/faiss.py +111 -0
- lfx/components/vectorstores/graph_rag.py +141 -0
- lfx/components/vectorstores/hcd.py +314 -0
- lfx/components/vectorstores/local_db.py +261 -0
- lfx/components/vectorstores/milvus.py +115 -0
- lfx/components/vectorstores/mongodb_atlas.py +213 -0
- lfx/components/vectorstores/opensearch.py +243 -0
- lfx/components/vectorstores/pgvector.py +72 -0
- lfx/components/vectorstores/pinecone.py +134 -0
- lfx/components/vectorstores/qdrant.py +109 -0
- lfx/components/vectorstores/supabase.py +76 -0
- lfx/components/vectorstores/upstash.py +124 -0
- lfx/components/vectorstores/vectara.py +97 -0
- lfx/components/vectorstores/vectara_rag.py +164 -0
- lfx/components/vectorstores/weaviate.py +89 -0
- lfx/components/vertexai/__init__.py +37 -0
- lfx/components/vertexai/vertexai.py +71 -0
- lfx/components/vertexai/vertexai_embeddings.py +67 -0
- lfx/components/weaviate/__init__.py +34 -0
- lfx/components/weaviate/weaviate.py +89 -0
- lfx/components/wikipedia/__init__.py +4 -0
- lfx/components/wikipedia/wikidata.py +86 -0
- lfx/components/wikipedia/wikipedia.py +53 -0
- lfx/components/wolframalpha/__init__.py +3 -0
- lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
- lfx/components/xai/__init__.py +32 -0
- lfx/components/xai/xai.py +167 -0
- lfx/components/yahoosearch/__init__.py +3 -0
- lfx/components/yahoosearch/yahoo.py +137 -0
- lfx/components/youtube/__init__.py +52 -0
- lfx/components/youtube/channel.py +227 -0
- lfx/components/youtube/comments.py +231 -0
- lfx/components/youtube/playlist.py +33 -0
- lfx/components/youtube/search.py +120 -0
- lfx/components/youtube/trending.py +285 -0
- lfx/components/youtube/video_details.py +263 -0
- lfx/components/youtube/youtube_transcripts.py +118 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +44 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +86 -0
- lfx/custom/code_parser/__init__.py +3 -0
- lfx/custom/code_parser/code_parser.py +361 -0
- lfx/custom/custom_component/__init__.py +0 -0
- lfx/custom/custom_component/base_component.py +128 -0
- lfx/custom/custom_component/component.py +1808 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +588 -0
- lfx/custom/dependency_analyzer.py +165 -0
- lfx/custom/directory_reader/__init__.py +3 -0
- lfx/custom/directory_reader/directory_reader.py +359 -0
- lfx/custom/directory_reader/utils.py +171 -0
- lfx/custom/eval.py +12 -0
- lfx/custom/schema.py +32 -0
- lfx/custom/tree_visitor.py +21 -0
- lfx/custom/utils.py +877 -0
- lfx/custom/validate.py +488 -0
- lfx/events/__init__.py +1 -0
- lfx/events/event_manager.py +110 -0
- lfx/exceptions/__init__.py +0 -0
- lfx/exceptions/component.py +15 -0
- lfx/field_typing/__init__.py +91 -0
- lfx/field_typing/constants.py +215 -0
- lfx/field_typing/range_spec.py +35 -0
- lfx/graph/__init__.py +6 -0
- lfx/graph/edge/__init__.py +0 -0
- lfx/graph/edge/base.py +277 -0
- lfx/graph/edge/schema.py +119 -0
- lfx/graph/edge/utils.py +0 -0
- lfx/graph/graph/__init__.py +0 -0
- lfx/graph/graph/ascii.py +202 -0
- lfx/graph/graph/base.py +2238 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +52 -0
- lfx/graph/graph/state_model.py +66 -0
- lfx/graph/graph/utils.py +1024 -0
- lfx/graph/schema.py +75 -0
- lfx/graph/state/__init__.py +0 -0
- lfx/graph/state/model.py +237 -0
- lfx/graph/utils.py +200 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +823 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +264 -0
- lfx/graph/vertex/schema.py +26 -0
- lfx/graph/vertex/utils.py +19 -0
- lfx/graph/vertex/vertex_types.py +489 -0
- lfx/helpers/__init__.py +1 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +194 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +328 -0
- lfx/inputs/inputs.py +714 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +489 -0
- lfx/interface/importing/__init__.py +5 -0
- lfx/interface/importing/utils.py +39 -0
- lfx/interface/initialize/__init__.py +3 -0
- lfx/interface/initialize/loading.py +224 -0
- lfx/interface/listing.py +26 -0
- lfx/interface/run.py +16 -0
- lfx/interface/utils.py +111 -0
- lfx/io/__init__.py +63 -0
- lfx/io/schema.py +289 -0
- lfx/load/__init__.py +8 -0
- lfx/load/load.py +256 -0
- lfx/load/utils.py +99 -0
- lfx/log/__init__.py +5 -0
- lfx/log/logger.py +385 -0
- lfx/memory/__init__.py +90 -0
- lfx/memory/stubs.py +283 -0
- lfx/processing/__init__.py +1 -0
- lfx/processing/process.py +238 -0
- lfx/processing/utils.py +25 -0
- lfx/py.typed +0 -0
- lfx/schema/__init__.py +66 -0
- lfx/schema/artifact.py +83 -0
- lfx/schema/content_block.py +62 -0
- lfx/schema/content_types.py +91 -0
- lfx/schema/data.py +308 -0
- lfx/schema/dataframe.py +210 -0
- lfx/schema/dotdict.py +74 -0
- lfx/schema/encoders.py +13 -0
- lfx/schema/graph.py +47 -0
- lfx/schema/image.py +131 -0
- lfx/schema/json_schema.py +141 -0
- lfx/schema/log.py +61 -0
- lfx/schema/message.py +473 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +171 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +140 -0
- lfx/schema/validators.py +114 -0
- lfx/serialization/__init__.py +5 -0
- lfx/serialization/constants.py +2 -0
- lfx/serialization/serialization.py +314 -0
- lfx/services/__init__.py +23 -0
- lfx/services/base.py +28 -0
- lfx/services/cache/__init__.py +6 -0
- lfx/services/cache/base.py +183 -0
- lfx/services/cache/service.py +166 -0
- lfx/services/cache/utils.py +169 -0
- lfx/services/chat/__init__.py +1 -0
- lfx/services/chat/config.py +2 -0
- lfx/services/chat/schema.py +10 -0
- lfx/services/deps.py +129 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +172 -0
- lfx/services/schema.py +20 -0
- lfx/services/session.py +82 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +130 -0
- lfx/services/settings/base.py +539 -0
- lfx/services/settings/constants.py +31 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +12 -0
- lfx/services/settings/service.py +35 -0
- lfx/services/settings/utils.py +40 -0
- lfx/services/shared_component_cache/__init__.py +1 -0
- lfx/services/shared_component_cache/factory.py +30 -0
- lfx/services/shared_component_cache/service.py +9 -0
- lfx/services/storage/__init__.py +5 -0
- lfx/services/storage/local.py +155 -0
- lfx/services/storage/service.py +54 -0
- lfx/services/tracing/__init__.py +1 -0
- lfx/services/tracing/service.py +21 -0
- lfx/settings.py +6 -0
- lfx/template/__init__.py +6 -0
- lfx/template/field/__init__.py +0 -0
- lfx/template/field/base.py +257 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +212 -0
- lfx/template/frontend_node/constants.py +65 -0
- lfx/template/frontend_node/custom_components.py +79 -0
- lfx/template/template/__init__.py +0 -0
- lfx/template/template/base.py +100 -0
- lfx/template/utils.py +217 -0
- lfx/type_extraction/__init__.py +19 -0
- lfx/type_extraction/type_extraction.py +75 -0
- lfx/type_extraction.py +80 -0
- lfx/utils/__init__.py +1 -0
- lfx/utils/async_helpers.py +42 -0
- lfx/utils/component_utils.py +154 -0
- lfx/utils/concurrency.py +60 -0
- lfx/utils/connection_string_parser.py +11 -0
- lfx/utils/constants.py +205 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +28 -0
- lfx/utils/image.py +73 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/util.py +481 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
- lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
- lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
- lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,314 @@
|
|
1
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
2
|
+
from lfx.helpers.data import docs_to_data
|
3
|
+
from lfx.inputs.inputs import DictInput, FloatInput
|
4
|
+
from lfx.io import (
|
5
|
+
BoolInput,
|
6
|
+
DropdownInput,
|
7
|
+
HandleInput,
|
8
|
+
IntInput,
|
9
|
+
MultilineInput,
|
10
|
+
SecretStrInput,
|
11
|
+
StrInput,
|
12
|
+
)
|
13
|
+
from lfx.schema.data import Data
|
14
|
+
|
15
|
+
|
16
|
+
class HCDVectorStoreComponent(LCVectorStoreComponent):
|
17
|
+
display_name: str = "Hyper-Converged Database"
|
18
|
+
description: str = "Implementation of Vector Store using Hyper-Converged Database (HCD) with search capabilities"
|
19
|
+
name = "HCD"
|
20
|
+
icon: str = "HCD"
|
21
|
+
|
22
|
+
inputs = [
|
23
|
+
StrInput(
|
24
|
+
name="collection_name",
|
25
|
+
display_name="Collection Name",
|
26
|
+
info="The name of the collection within HCD where the vectors will be stored.",
|
27
|
+
required=True,
|
28
|
+
),
|
29
|
+
StrInput(
|
30
|
+
name="username",
|
31
|
+
display_name="HCD Username",
|
32
|
+
info="Authentication username for accessing HCD.",
|
33
|
+
value="hcd-superuser",
|
34
|
+
required=True,
|
35
|
+
),
|
36
|
+
SecretStrInput(
|
37
|
+
name="password",
|
38
|
+
display_name="HCD Password",
|
39
|
+
info="Authentication password for accessing HCD.",
|
40
|
+
value="HCD_PASSWORD",
|
41
|
+
required=True,
|
42
|
+
),
|
43
|
+
SecretStrInput(
|
44
|
+
name="api_endpoint",
|
45
|
+
display_name="HCD API Endpoint",
|
46
|
+
info="API endpoint URL for the HCD service.",
|
47
|
+
value="HCD_API_ENDPOINT",
|
48
|
+
required=True,
|
49
|
+
),
|
50
|
+
*LCVectorStoreComponent.inputs,
|
51
|
+
StrInput(
|
52
|
+
name="namespace",
|
53
|
+
display_name="Namespace",
|
54
|
+
info="Optional namespace within HCD to use for the collection.",
|
55
|
+
value="default_namespace",
|
56
|
+
advanced=True,
|
57
|
+
),
|
58
|
+
MultilineInput(
|
59
|
+
name="ca_certificate",
|
60
|
+
display_name="CA Certificate",
|
61
|
+
info="Optional CA certificate for TLS connections to HCD.",
|
62
|
+
advanced=True,
|
63
|
+
),
|
64
|
+
DropdownInput(
|
65
|
+
name="metric",
|
66
|
+
display_name="Metric",
|
67
|
+
info="Optional distance metric for vector comparisons in the vector store.",
|
68
|
+
options=["cosine", "dot_product", "euclidean"],
|
69
|
+
advanced=True,
|
70
|
+
),
|
71
|
+
IntInput(
|
72
|
+
name="batch_size",
|
73
|
+
display_name="Batch Size",
|
74
|
+
info="Optional number of data to process in a single batch.",
|
75
|
+
advanced=True,
|
76
|
+
),
|
77
|
+
IntInput(
|
78
|
+
name="bulk_insert_batch_concurrency",
|
79
|
+
display_name="Bulk Insert Batch Concurrency",
|
80
|
+
info="Optional concurrency level for bulk insert operations.",
|
81
|
+
advanced=True,
|
82
|
+
),
|
83
|
+
IntInput(
|
84
|
+
name="bulk_insert_overwrite_concurrency",
|
85
|
+
display_name="Bulk Insert Overwrite Concurrency",
|
86
|
+
info="Optional concurrency level for bulk insert operations that overwrite existing data.",
|
87
|
+
advanced=True,
|
88
|
+
),
|
89
|
+
IntInput(
|
90
|
+
name="bulk_delete_concurrency",
|
91
|
+
display_name="Bulk Delete Concurrency",
|
92
|
+
info="Optional concurrency level for bulk delete operations.",
|
93
|
+
advanced=True,
|
94
|
+
),
|
95
|
+
DropdownInput(
|
96
|
+
name="setup_mode",
|
97
|
+
display_name="Setup Mode",
|
98
|
+
info="Configuration mode for setting up the vector store, with options like 'Sync', 'Async', or 'Off'.",
|
99
|
+
options=["Sync", "Async", "Off"],
|
100
|
+
advanced=True,
|
101
|
+
value="Sync",
|
102
|
+
),
|
103
|
+
BoolInput(
|
104
|
+
name="pre_delete_collection",
|
105
|
+
display_name="Pre Delete Collection",
|
106
|
+
info="Boolean flag to determine whether to delete the collection before creating a new one.",
|
107
|
+
advanced=True,
|
108
|
+
),
|
109
|
+
StrInput(
|
110
|
+
name="metadata_indexing_include",
|
111
|
+
display_name="Metadata Indexing Include",
|
112
|
+
info="Optional list of metadata fields to include in the indexing.",
|
113
|
+
advanced=True,
|
114
|
+
),
|
115
|
+
HandleInput(
|
116
|
+
name="embedding",
|
117
|
+
display_name="Embedding or Astra Vectorize",
|
118
|
+
input_types=["Embeddings", "dict"],
|
119
|
+
# TODO: This should be optional, but need to refactor langchain-astradb first.
|
120
|
+
info="Allows either an embedding model or an Astra Vectorize configuration.",
|
121
|
+
),
|
122
|
+
StrInput(
|
123
|
+
name="metadata_indexing_exclude",
|
124
|
+
display_name="Metadata Indexing Exclude",
|
125
|
+
info="Optional list of metadata fields to exclude from the indexing.",
|
126
|
+
advanced=True,
|
127
|
+
),
|
128
|
+
StrInput(
|
129
|
+
name="collection_indexing_policy",
|
130
|
+
display_name="Collection Indexing Policy",
|
131
|
+
info="Optional dictionary defining the indexing policy for the collection.",
|
132
|
+
advanced=True,
|
133
|
+
),
|
134
|
+
IntInput(
|
135
|
+
name="number_of_results",
|
136
|
+
display_name="Number of Results",
|
137
|
+
info="Number of results to return.",
|
138
|
+
advanced=True,
|
139
|
+
value=4,
|
140
|
+
),
|
141
|
+
DropdownInput(
|
142
|
+
name="search_type",
|
143
|
+
display_name="Search Type",
|
144
|
+
info="Search type to use",
|
145
|
+
options=["Similarity", "Similarity with score threshold", "MMR (Max Marginal Relevance)"],
|
146
|
+
value="Similarity",
|
147
|
+
advanced=True,
|
148
|
+
),
|
149
|
+
FloatInput(
|
150
|
+
name="search_score_threshold",
|
151
|
+
display_name="Search Score Threshold",
|
152
|
+
info="Minimum similarity score threshold for search results. "
|
153
|
+
"(when using 'Similarity with score threshold')",
|
154
|
+
value=0,
|
155
|
+
advanced=True,
|
156
|
+
),
|
157
|
+
DictInput(
|
158
|
+
name="search_filter",
|
159
|
+
display_name="Search Metadata Filter",
|
160
|
+
info="Optional dictionary of filters to apply to the search query.",
|
161
|
+
advanced=True,
|
162
|
+
is_list=True,
|
163
|
+
),
|
164
|
+
]
|
165
|
+
|
166
|
+
@check_cached_vector_store
|
167
|
+
def build_vector_store(self):
|
168
|
+
try:
|
169
|
+
from langchain_astradb import AstraDBVectorStore
|
170
|
+
from langchain_astradb.utils.astradb import SetupMode
|
171
|
+
except ImportError as e:
|
172
|
+
msg = (
|
173
|
+
"Could not import langchain Astra DB integration package. "
|
174
|
+
"Please install it with `pip install langchain-astradb`."
|
175
|
+
)
|
176
|
+
raise ImportError(msg) from e
|
177
|
+
|
178
|
+
try:
|
179
|
+
from astrapy.authentication import UsernamePasswordTokenProvider
|
180
|
+
from astrapy.constants import Environment
|
181
|
+
except ImportError as e:
|
182
|
+
msg = "Could not import astrapy integration package. Please install it with `pip install astrapy`."
|
183
|
+
raise ImportError(msg) from e
|
184
|
+
|
185
|
+
try:
|
186
|
+
if not self.setup_mode:
|
187
|
+
self.setup_mode = self._inputs["setup_mode"].options[0]
|
188
|
+
|
189
|
+
setup_mode_value = SetupMode[self.setup_mode.upper()]
|
190
|
+
except KeyError as e:
|
191
|
+
msg = f"Invalid setup mode: {self.setup_mode}"
|
192
|
+
raise ValueError(msg) from e
|
193
|
+
|
194
|
+
if not isinstance(self.embedding, dict):
|
195
|
+
embedding_dict = {"embedding": self.embedding}
|
196
|
+
else:
|
197
|
+
from astrapy.info import VectorServiceOptions
|
198
|
+
|
199
|
+
dict_options = self.embedding.get("collection_vector_service_options", {})
|
200
|
+
dict_options["authentication"] = {
|
201
|
+
k: v for k, v in dict_options.get("authentication", {}).items() if k and v
|
202
|
+
}
|
203
|
+
dict_options["parameters"] = {k: v for k, v in dict_options.get("parameters", {}).items() if k and v}
|
204
|
+
embedding_dict = {"collection_vector_service_options": VectorServiceOptions.from_dict(dict_options)}
|
205
|
+
collection_embedding_api_key = self.embedding.get("collection_embedding_api_key")
|
206
|
+
if collection_embedding_api_key:
|
207
|
+
embedding_dict["collection_embedding_api_key"] = collection_embedding_api_key
|
208
|
+
|
209
|
+
token_provider = UsernamePasswordTokenProvider(self.username, self.password)
|
210
|
+
vector_store_kwargs = {
|
211
|
+
**embedding_dict,
|
212
|
+
"collection_name": self.collection_name,
|
213
|
+
"token": token_provider,
|
214
|
+
"api_endpoint": self.api_endpoint,
|
215
|
+
"namespace": self.namespace,
|
216
|
+
"metric": self.metric or None,
|
217
|
+
"batch_size": self.batch_size or None,
|
218
|
+
"bulk_insert_batch_concurrency": self.bulk_insert_batch_concurrency or None,
|
219
|
+
"bulk_insert_overwrite_concurrency": self.bulk_insert_overwrite_concurrency or None,
|
220
|
+
"bulk_delete_concurrency": self.bulk_delete_concurrency or None,
|
221
|
+
"setup_mode": setup_mode_value,
|
222
|
+
"pre_delete_collection": self.pre_delete_collection or False,
|
223
|
+
"environment": Environment.HCD,
|
224
|
+
}
|
225
|
+
|
226
|
+
if self.metadata_indexing_include:
|
227
|
+
vector_store_kwargs["metadata_indexing_include"] = self.metadata_indexing_include
|
228
|
+
elif self.metadata_indexing_exclude:
|
229
|
+
vector_store_kwargs["metadata_indexing_exclude"] = self.metadata_indexing_exclude
|
230
|
+
elif self.collection_indexing_policy:
|
231
|
+
vector_store_kwargs["collection_indexing_policy"] = self.collection_indexing_policy
|
232
|
+
|
233
|
+
try:
|
234
|
+
vector_store = AstraDBVectorStore(**vector_store_kwargs)
|
235
|
+
except Exception as e:
|
236
|
+
msg = f"Error initializing AstraDBVectorStore: {e}"
|
237
|
+
raise ValueError(msg) from e
|
238
|
+
|
239
|
+
self._add_documents_to_vector_store(vector_store)
|
240
|
+
return vector_store
|
241
|
+
|
242
|
+
def _add_documents_to_vector_store(self, vector_store) -> None:
|
243
|
+
# Convert DataFrame to Data if needed using parent's method
|
244
|
+
self.ingest_data = self._prepare_ingest_data()
|
245
|
+
|
246
|
+
documents = []
|
247
|
+
for _input in self.ingest_data or []:
|
248
|
+
if isinstance(_input, Data):
|
249
|
+
documents.append(_input.to_lc_document())
|
250
|
+
else:
|
251
|
+
msg = "Vector Store Inputs must be Data objects."
|
252
|
+
raise TypeError(msg)
|
253
|
+
|
254
|
+
if documents:
|
255
|
+
self.log(f"Adding {len(documents)} documents to the Vector Store.")
|
256
|
+
try:
|
257
|
+
vector_store.add_documents(documents)
|
258
|
+
except Exception as e:
|
259
|
+
msg = f"Error adding documents to AstraDBVectorStore: {e}"
|
260
|
+
raise ValueError(msg) from e
|
261
|
+
else:
|
262
|
+
self.log("No documents to add to the Vector Store.")
|
263
|
+
|
264
|
+
def _map_search_type(self) -> str:
|
265
|
+
if self.search_type == "Similarity with score threshold":
|
266
|
+
return "similarity_score_threshold"
|
267
|
+
if self.search_type == "MMR (Max Marginal Relevance)":
|
268
|
+
return "mmr"
|
269
|
+
return "similarity"
|
270
|
+
|
271
|
+
def _build_search_args(self):
|
272
|
+
args = {
|
273
|
+
"k": self.number_of_results,
|
274
|
+
"score_threshold": self.search_score_threshold,
|
275
|
+
}
|
276
|
+
|
277
|
+
if self.search_filter:
|
278
|
+
clean_filter = {k: v for k, v in self.search_filter.items() if k and v}
|
279
|
+
if len(clean_filter) > 0:
|
280
|
+
args["filter"] = clean_filter
|
281
|
+
return args
|
282
|
+
|
283
|
+
def search_documents(self) -> list[Data]:
|
284
|
+
vector_store = self.build_vector_store()
|
285
|
+
|
286
|
+
self.log(f"Search query: {self.search_query}")
|
287
|
+
self.log(f"Search type: {self.search_type}")
|
288
|
+
self.log(f"Number of results: {self.number_of_results}")
|
289
|
+
|
290
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
291
|
+
try:
|
292
|
+
search_type = self._map_search_type()
|
293
|
+
search_args = self._build_search_args()
|
294
|
+
|
295
|
+
docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)
|
296
|
+
except Exception as e:
|
297
|
+
msg = f"Error performing search in AstraDBVectorStore: {e}"
|
298
|
+
raise ValueError(msg) from e
|
299
|
+
|
300
|
+
self.log(f"Retrieved documents: {len(docs)}")
|
301
|
+
|
302
|
+
data = docs_to_data(docs)
|
303
|
+
self.log(f"Converted documents to data: {len(data)}")
|
304
|
+
self.status = data
|
305
|
+
return data
|
306
|
+
self.log("No search input provided. Skipping search.")
|
307
|
+
return []
|
308
|
+
|
309
|
+
def get_retriever_kwargs(self):
|
310
|
+
search_args = self._build_search_args()
|
311
|
+
return {
|
312
|
+
"search_type": self._map_search_type(),
|
313
|
+
"search_kwargs": search_args,
|
314
|
+
}
|
@@ -0,0 +1,261 @@
|
|
1
|
+
from copy import deepcopy
|
2
|
+
from pathlib import Path
|
3
|
+
|
4
|
+
from langchain_chroma import Chroma
|
5
|
+
from typing_extensions import override
|
6
|
+
|
7
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
8
|
+
from lfx.base.vectorstores.utils import chroma_collection_to_data
|
9
|
+
from lfx.inputs.inputs import MultilineInput
|
10
|
+
from lfx.io import BoolInput, DropdownInput, HandleInput, IntInput, MessageTextInput, TabInput
|
11
|
+
from lfx.log.logger import logger
|
12
|
+
from lfx.schema.data import Data
|
13
|
+
from lfx.schema.dataframe import DataFrame
|
14
|
+
from lfx.template.field.base import Output
|
15
|
+
|
16
|
+
|
17
|
+
class LocalDBComponent(LCVectorStoreComponent):
|
18
|
+
"""Chroma Vector Store with search capabilities."""
|
19
|
+
|
20
|
+
display_name: str = "Local DB"
|
21
|
+
description: str = "Local Vector Store with search capabilities"
|
22
|
+
name = "LocalDB"
|
23
|
+
icon = "database"
|
24
|
+
legacy = True
|
25
|
+
|
26
|
+
inputs = [
|
27
|
+
TabInput(
|
28
|
+
name="mode",
|
29
|
+
display_name="Mode",
|
30
|
+
options=["Ingest", "Retrieve"],
|
31
|
+
info="Select the operation mode",
|
32
|
+
value="Ingest",
|
33
|
+
real_time_refresh=True,
|
34
|
+
show=True,
|
35
|
+
),
|
36
|
+
MessageTextInput(
|
37
|
+
name="collection_name",
|
38
|
+
display_name="Collection Name",
|
39
|
+
value="langflow",
|
40
|
+
required=True,
|
41
|
+
),
|
42
|
+
MessageTextInput(
|
43
|
+
name="persist_directory",
|
44
|
+
display_name="Persist Directory",
|
45
|
+
info=(
|
46
|
+
"Custom base directory to save the vector store. "
|
47
|
+
"Collections will be stored under '{directory}/vector_stores/{collection_name}'. "
|
48
|
+
"If not specified, it will use your system's cache folder."
|
49
|
+
),
|
50
|
+
advanced=True,
|
51
|
+
),
|
52
|
+
DropdownInput(
|
53
|
+
name="existing_collections",
|
54
|
+
display_name="Existing Collections",
|
55
|
+
options=[], # Will be populated dynamically
|
56
|
+
info="Select a previously created collection to search through its stored data.",
|
57
|
+
show=False,
|
58
|
+
combobox=True,
|
59
|
+
),
|
60
|
+
HandleInput(name="embedding", display_name="Embedding", required=True, input_types=["Embeddings"]),
|
61
|
+
BoolInput(
|
62
|
+
name="allow_duplicates",
|
63
|
+
display_name="Allow Duplicates",
|
64
|
+
advanced=True,
|
65
|
+
info="If false, will not add documents that are already in the Vector Store.",
|
66
|
+
),
|
67
|
+
DropdownInput(
|
68
|
+
name="search_type",
|
69
|
+
display_name="Search Type",
|
70
|
+
options=["Similarity", "MMR"],
|
71
|
+
value="Similarity",
|
72
|
+
advanced=True,
|
73
|
+
),
|
74
|
+
HandleInput(
|
75
|
+
name="ingest_data",
|
76
|
+
display_name="Ingest Data",
|
77
|
+
input_types=["Data", "DataFrame"],
|
78
|
+
is_list=True,
|
79
|
+
info="Data to store. It will be embedded and indexed for semantic search.",
|
80
|
+
show=True,
|
81
|
+
),
|
82
|
+
MultilineInput(
|
83
|
+
name="search_query",
|
84
|
+
display_name="Search Query",
|
85
|
+
tool_mode=True,
|
86
|
+
info="Enter text to search for similar content in the selected collection.",
|
87
|
+
show=False,
|
88
|
+
),
|
89
|
+
IntInput(
|
90
|
+
name="number_of_results",
|
91
|
+
display_name="Number of Results",
|
92
|
+
info="Number of results to return.",
|
93
|
+
advanced=True,
|
94
|
+
value=10,
|
95
|
+
),
|
96
|
+
IntInput(
|
97
|
+
name="limit",
|
98
|
+
display_name="Limit",
|
99
|
+
advanced=True,
|
100
|
+
info="Limit the number of records to compare when Allow Duplicates is False.",
|
101
|
+
),
|
102
|
+
]
|
103
|
+
outputs = [
|
104
|
+
Output(display_name="DataFrame", name="dataframe", method="perform_search"),
|
105
|
+
]
|
106
|
+
|
107
|
+
def get_vector_store_directory(self, base_dir: str | Path) -> Path:
|
108
|
+
"""Get the full directory path for a collection."""
|
109
|
+
# Ensure base_dir is a Path object
|
110
|
+
base_dir = Path(base_dir)
|
111
|
+
# Create the full path: base_dir/vector_stores/collection_name
|
112
|
+
full_path = base_dir / "vector_stores" / self.collection_name
|
113
|
+
# Create the directory if it doesn't exist
|
114
|
+
full_path.mkdir(parents=True, exist_ok=True)
|
115
|
+
return full_path
|
116
|
+
|
117
|
+
def get_default_persist_dir(self) -> str:
|
118
|
+
"""Get the default persist directory from cache."""
|
119
|
+
from lfx.services.cache.utils import CACHE_DIR
|
120
|
+
|
121
|
+
return str(self.get_vector_store_directory(CACHE_DIR))
|
122
|
+
|
123
|
+
def list_existing_collections(self) -> list[str]:
|
124
|
+
"""List existing vector store collections from the persist directory."""
|
125
|
+
from lfx.services.cache.utils import CACHE_DIR
|
126
|
+
|
127
|
+
# Get the base directory (either custom or cache)
|
128
|
+
base_dir = Path(self.persist_directory) if self.persist_directory else Path(CACHE_DIR)
|
129
|
+
# Get the vector_stores subdirectory
|
130
|
+
vector_stores_dir = base_dir / "vector_stores"
|
131
|
+
if not vector_stores_dir.exists():
|
132
|
+
return []
|
133
|
+
|
134
|
+
return [d.name for d in vector_stores_dir.iterdir() if d.is_dir()]
|
135
|
+
|
136
|
+
def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None) -> dict:
|
137
|
+
"""Update the build configuration when the mode changes."""
|
138
|
+
if field_name == "mode":
|
139
|
+
# Hide all dynamic fields by default
|
140
|
+
dynamic_fields = [
|
141
|
+
"ingest_data",
|
142
|
+
"search_query",
|
143
|
+
"search_type",
|
144
|
+
"number_of_results",
|
145
|
+
"existing_collections",
|
146
|
+
"collection_name",
|
147
|
+
"embedding",
|
148
|
+
"allow_duplicates",
|
149
|
+
"limit",
|
150
|
+
]
|
151
|
+
for field in dynamic_fields:
|
152
|
+
if field in build_config:
|
153
|
+
build_config[field]["show"] = False
|
154
|
+
|
155
|
+
# Show/hide fields based on selected mode
|
156
|
+
if field_value == "Ingest":
|
157
|
+
if "ingest_data" in build_config:
|
158
|
+
build_config["ingest_data"]["show"] = True
|
159
|
+
if "collection_name" in build_config:
|
160
|
+
build_config["collection_name"]["show"] = True
|
161
|
+
build_config["collection_name"]["display_name"] = "Name Your Collection"
|
162
|
+
if "persist" in build_config:
|
163
|
+
build_config["persist"]["show"] = True
|
164
|
+
if "persist_directory" in build_config:
|
165
|
+
build_config["persist_directory"]["show"] = True
|
166
|
+
if "embedding" in build_config:
|
167
|
+
build_config["embedding"]["show"] = True
|
168
|
+
if "allow_duplicates" in build_config:
|
169
|
+
build_config["allow_duplicates"]["show"] = True
|
170
|
+
if "limit" in build_config:
|
171
|
+
build_config["limit"]["show"] = True
|
172
|
+
elif field_value == "Retrieve":
|
173
|
+
if "persist" in build_config:
|
174
|
+
build_config["persist"]["show"] = False
|
175
|
+
build_config["search_query"]["show"] = True
|
176
|
+
build_config["search_type"]["show"] = True
|
177
|
+
build_config["number_of_results"]["show"] = True
|
178
|
+
build_config["embedding"]["show"] = True
|
179
|
+
build_config["collection_name"]["show"] = False
|
180
|
+
# Show existing collections dropdown and update its options
|
181
|
+
if "existing_collections" in build_config:
|
182
|
+
build_config["existing_collections"]["show"] = True
|
183
|
+
build_config["existing_collections"]["options"] = self.list_existing_collections()
|
184
|
+
# Hide collection_name in Retrieve mode since we use existing_collections
|
185
|
+
elif field_name == "existing_collections":
|
186
|
+
# Update collection_name when an existing collection is selected
|
187
|
+
if "collection_name" in build_config:
|
188
|
+
build_config["collection_name"]["value"] = field_value
|
189
|
+
|
190
|
+
return build_config
|
191
|
+
|
192
|
+
@override
|
193
|
+
@check_cached_vector_store
|
194
|
+
def build_vector_store(self) -> Chroma:
|
195
|
+
"""Builds the Chroma object."""
|
196
|
+
try:
|
197
|
+
from langchain_chroma import Chroma
|
198
|
+
except ImportError as e:
|
199
|
+
msg = "Could not import Chroma integration package. Please install it with `pip install langchain-chroma`."
|
200
|
+
raise ImportError(msg) from e
|
201
|
+
# Chroma settings
|
202
|
+
# chroma_settings = None
|
203
|
+
if self.existing_collections:
|
204
|
+
self.collection_name = self.existing_collections
|
205
|
+
|
206
|
+
# Use user-provided directory or default cache directory
|
207
|
+
if self.persist_directory:
|
208
|
+
base_dir = self.resolve_path(self.persist_directory)
|
209
|
+
persist_directory = str(self.get_vector_store_directory(base_dir))
|
210
|
+
logger.debug(f"Using custom persist directory: {persist_directory}")
|
211
|
+
else:
|
212
|
+
persist_directory = self.get_default_persist_dir()
|
213
|
+
logger.debug(f"Using default persist directory: {persist_directory}")
|
214
|
+
|
215
|
+
chroma = Chroma(
|
216
|
+
persist_directory=persist_directory,
|
217
|
+
client=None,
|
218
|
+
embedding_function=self.embedding,
|
219
|
+
collection_name=self.collection_name,
|
220
|
+
)
|
221
|
+
|
222
|
+
self._add_documents_to_vector_store(chroma)
|
223
|
+
self.status = chroma_collection_to_data(chroma.get(limit=self.limit))
|
224
|
+
return chroma
|
225
|
+
|
226
|
+
def _add_documents_to_vector_store(self, vector_store: "Chroma") -> None:
|
227
|
+
"""Adds documents to the Vector Store."""
|
228
|
+
ingest_data: list | Data | DataFrame = self.ingest_data
|
229
|
+
if not ingest_data:
|
230
|
+
self.status = ""
|
231
|
+
return
|
232
|
+
|
233
|
+
# Convert DataFrame to Data if needed using parent's method
|
234
|
+
ingest_data = self._prepare_ingest_data()
|
235
|
+
|
236
|
+
stored_documents_without_id = []
|
237
|
+
if self.allow_duplicates:
|
238
|
+
stored_data = []
|
239
|
+
else:
|
240
|
+
stored_data = chroma_collection_to_data(vector_store.get(limit=self.limit))
|
241
|
+
for value in deepcopy(stored_data):
|
242
|
+
del value.id
|
243
|
+
stored_documents_without_id.append(value)
|
244
|
+
|
245
|
+
documents = []
|
246
|
+
for _input in ingest_data or []:
|
247
|
+
if isinstance(_input, Data):
|
248
|
+
if _input not in stored_documents_without_id:
|
249
|
+
documents.append(_input.to_lc_document())
|
250
|
+
else:
|
251
|
+
msg = "Vector Store Inputs must be Data objects."
|
252
|
+
raise TypeError(msg)
|
253
|
+
|
254
|
+
if documents and self.embedding is not None:
|
255
|
+
self.log(f"Adding {len(documents)} documents to the Vector Store.")
|
256
|
+
vector_store.add_documents(documents)
|
257
|
+
else:
|
258
|
+
self.log("No documents to add to the Vector Store.")
|
259
|
+
|
260
|
+
def perform_search(self) -> DataFrame:
|
261
|
+
return DataFrame(self.search_documents())
|
@@ -0,0 +1,115 @@
|
|
1
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
2
|
+
from lfx.helpers.data import docs_to_data
|
3
|
+
from lfx.io import (
|
4
|
+
BoolInput,
|
5
|
+
DictInput,
|
6
|
+
DropdownInput,
|
7
|
+
FloatInput,
|
8
|
+
HandleInput,
|
9
|
+
IntInput,
|
10
|
+
SecretStrInput,
|
11
|
+
StrInput,
|
12
|
+
)
|
13
|
+
from lfx.schema.data import Data
|
14
|
+
|
15
|
+
|
16
|
+
class MilvusVectorStoreComponent(LCVectorStoreComponent):
|
17
|
+
"""Milvus vector store with search capabilities."""
|
18
|
+
|
19
|
+
display_name: str = "Milvus"
|
20
|
+
description: str = "Milvus vector store with search capabilities"
|
21
|
+
name = "Milvus"
|
22
|
+
icon = "Milvus"
|
23
|
+
|
24
|
+
inputs = [
|
25
|
+
StrInput(name="collection_name", display_name="Collection Name", value="langflow"),
|
26
|
+
StrInput(name="collection_description", display_name="Collection Description", value=""),
|
27
|
+
StrInput(
|
28
|
+
name="uri",
|
29
|
+
display_name="Connection URI",
|
30
|
+
value="http://localhost:19530",
|
31
|
+
),
|
32
|
+
SecretStrInput(
|
33
|
+
name="password",
|
34
|
+
display_name="Token",
|
35
|
+
value="",
|
36
|
+
info="Ignore this field if no token is required to make connection.",
|
37
|
+
),
|
38
|
+
DictInput(name="connection_args", display_name="Other Connection Arguments", advanced=True),
|
39
|
+
StrInput(name="primary_field", display_name="Primary Field Name", value="pk"),
|
40
|
+
StrInput(name="text_field", display_name="Text Field Name", value="text"),
|
41
|
+
StrInput(name="vector_field", display_name="Vector Field Name", value="vector"),
|
42
|
+
DropdownInput(
|
43
|
+
name="consistency_level",
|
44
|
+
display_name="Consistencey Level",
|
45
|
+
options=["Bounded", "Session", "Strong", "Eventual"],
|
46
|
+
value="Session",
|
47
|
+
advanced=True,
|
48
|
+
),
|
49
|
+
DictInput(name="index_params", display_name="Index Parameters", advanced=True),
|
50
|
+
DictInput(name="search_params", display_name="Search Parameters", advanced=True),
|
51
|
+
BoolInput(name="drop_old", display_name="Drop Old Collection", value=False, advanced=True),
|
52
|
+
FloatInput(name="timeout", display_name="Timeout", advanced=True),
|
53
|
+
*LCVectorStoreComponent.inputs,
|
54
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
55
|
+
IntInput(
|
56
|
+
name="number_of_results",
|
57
|
+
display_name="Number of Results",
|
58
|
+
info="Number of results to return.",
|
59
|
+
value=4,
|
60
|
+
advanced=True,
|
61
|
+
),
|
62
|
+
]
|
63
|
+
|
64
|
+
@check_cached_vector_store
|
65
|
+
def build_vector_store(self):
|
66
|
+
try:
|
67
|
+
from langchain_milvus.vectorstores import Milvus as LangchainMilvus
|
68
|
+
except ImportError as e:
|
69
|
+
msg = "Could not import Milvus integration package. Please install it with `pip install langchain-milvus`."
|
70
|
+
raise ImportError(msg) from e
|
71
|
+
self.connection_args.update(uri=self.uri, token=self.password)
|
72
|
+
milvus_store = LangchainMilvus(
|
73
|
+
embedding_function=self.embedding,
|
74
|
+
collection_name=self.collection_name,
|
75
|
+
collection_description=self.collection_description,
|
76
|
+
connection_args=self.connection_args,
|
77
|
+
consistency_level=self.consistency_level,
|
78
|
+
index_params=self.index_params,
|
79
|
+
search_params=self.search_params,
|
80
|
+
drop_old=self.drop_old,
|
81
|
+
auto_id=True,
|
82
|
+
primary_field=self.primary_field,
|
83
|
+
text_field=self.text_field,
|
84
|
+
vector_field=self.vector_field,
|
85
|
+
timeout=self.timeout,
|
86
|
+
)
|
87
|
+
|
88
|
+
# Convert DataFrame to Data if needed using parent's method
|
89
|
+
self.ingest_data = self._prepare_ingest_data()
|
90
|
+
|
91
|
+
documents = []
|
92
|
+
for _input in self.ingest_data or []:
|
93
|
+
if isinstance(_input, Data):
|
94
|
+
documents.append(_input.to_lc_document())
|
95
|
+
else:
|
96
|
+
documents.append(_input)
|
97
|
+
|
98
|
+
if documents:
|
99
|
+
milvus_store.add_documents(documents)
|
100
|
+
|
101
|
+
return milvus_store
|
102
|
+
|
103
|
+
def search_documents(self) -> list[Data]:
|
104
|
+
vector_store = self.build_vector_store()
|
105
|
+
|
106
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
107
|
+
docs = vector_store.similarity_search(
|
108
|
+
query=self.search_query,
|
109
|
+
k=self.number_of_results,
|
110
|
+
)
|
111
|
+
|
112
|
+
data = docs_to_data(docs)
|
113
|
+
self.status = data
|
114
|
+
return data
|
115
|
+
return []
|