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,213 @@
|
|
1
|
+
import tempfile
|
2
|
+
import time
|
3
|
+
|
4
|
+
import certifi
|
5
|
+
from langchain_community.vectorstores import MongoDBAtlasVectorSearch
|
6
|
+
from pymongo.collection import Collection
|
7
|
+
from pymongo.operations import SearchIndexModel
|
8
|
+
|
9
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
10
|
+
from lfx.helpers.data import docs_to_data
|
11
|
+
from lfx.io import BoolInput, DropdownInput, HandleInput, IntInput, SecretStrInput, StrInput
|
12
|
+
from lfx.schema.data import Data
|
13
|
+
|
14
|
+
|
15
|
+
class MongoVectorStoreComponent(LCVectorStoreComponent):
|
16
|
+
display_name = "MongoDB Atlas"
|
17
|
+
description = "MongoDB Atlas Vector Store with search capabilities"
|
18
|
+
name = "MongoDBAtlasVector"
|
19
|
+
icon = "MongoDB"
|
20
|
+
INSERT_MODES = ["append", "overwrite"]
|
21
|
+
SIMILARITY_OPTIONS = ["cosine", "euclidean", "dotProduct"]
|
22
|
+
QUANTIZATION_OPTIONS = ["scalar", "binary"]
|
23
|
+
inputs = [
|
24
|
+
SecretStrInput(name="mongodb_atlas_cluster_uri", display_name="MongoDB Atlas Cluster URI", required=True),
|
25
|
+
BoolInput(name="enable_mtls", display_name="Enable mTLS", value=False, advanced=True, required=True),
|
26
|
+
SecretStrInput(
|
27
|
+
name="mongodb_atlas_client_cert",
|
28
|
+
display_name="MongoDB Atlas Combined Client Certificate",
|
29
|
+
required=False,
|
30
|
+
info="Client Certificate combined with the private key in the following format:\n "
|
31
|
+
"-----BEGIN PRIVATE KEY-----\n...\n -----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\n"
|
32
|
+
"...\n-----END CERTIFICATE-----\n",
|
33
|
+
),
|
34
|
+
StrInput(name="db_name", display_name="Database Name", required=True),
|
35
|
+
StrInput(name="collection_name", display_name="Collection Name", required=True),
|
36
|
+
StrInput(
|
37
|
+
name="index_name",
|
38
|
+
display_name="Index Name",
|
39
|
+
required=True,
|
40
|
+
info="The name of Atlas Search index, it should be a Vector Search.",
|
41
|
+
),
|
42
|
+
*LCVectorStoreComponent.inputs,
|
43
|
+
DropdownInput(
|
44
|
+
name="insert_mode",
|
45
|
+
display_name="Insert Mode",
|
46
|
+
options=INSERT_MODES,
|
47
|
+
value=INSERT_MODES[0],
|
48
|
+
info="How to insert new documents into the collection.",
|
49
|
+
advanced=True,
|
50
|
+
),
|
51
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
52
|
+
IntInput(
|
53
|
+
name="number_of_results",
|
54
|
+
display_name="Number of Results",
|
55
|
+
info="Number of results to return.",
|
56
|
+
value=4,
|
57
|
+
advanced=True,
|
58
|
+
),
|
59
|
+
StrInput(
|
60
|
+
name="index_field",
|
61
|
+
display_name="Index Field",
|
62
|
+
advanced=True,
|
63
|
+
required=True,
|
64
|
+
info="The field to index.",
|
65
|
+
value="embedding",
|
66
|
+
),
|
67
|
+
StrInput(
|
68
|
+
name="filter_field", display_name="Filter Field", advanced=True, info="The field to filter the index."
|
69
|
+
),
|
70
|
+
IntInput(
|
71
|
+
name="number_dimensions",
|
72
|
+
display_name="Number of Dimensions",
|
73
|
+
info="Embedding Context Length.",
|
74
|
+
value=1536,
|
75
|
+
advanced=True,
|
76
|
+
required=True,
|
77
|
+
),
|
78
|
+
DropdownInput(
|
79
|
+
name="similarity",
|
80
|
+
display_name="Similarity",
|
81
|
+
options=SIMILARITY_OPTIONS,
|
82
|
+
value=SIMILARITY_OPTIONS[0],
|
83
|
+
info="The method used to measure the similarity between vectors.",
|
84
|
+
advanced=True,
|
85
|
+
),
|
86
|
+
DropdownInput(
|
87
|
+
name="quantization",
|
88
|
+
display_name="Quantization",
|
89
|
+
options=QUANTIZATION_OPTIONS,
|
90
|
+
value=None,
|
91
|
+
info="Quantization reduces memory costs converting 32-bit floats to smaller data types",
|
92
|
+
advanced=True,
|
93
|
+
),
|
94
|
+
]
|
95
|
+
|
96
|
+
@check_cached_vector_store
|
97
|
+
def build_vector_store(self) -> MongoDBAtlasVectorSearch:
|
98
|
+
try:
|
99
|
+
from pymongo import MongoClient
|
100
|
+
except ImportError as e:
|
101
|
+
msg = "Please install pymongo to use MongoDB Atlas Vector Store"
|
102
|
+
raise ImportError(msg) from e
|
103
|
+
|
104
|
+
# Create temporary files for the client certificate
|
105
|
+
if self.enable_mtls:
|
106
|
+
client_cert_path = None
|
107
|
+
try:
|
108
|
+
client_cert = self.mongodb_atlas_client_cert.replace(" ", "\n")
|
109
|
+
client_cert = client_cert.replace("-----BEGIN\nPRIVATE\nKEY-----", "-----BEGIN PRIVATE KEY-----")
|
110
|
+
client_cert = client_cert.replace(
|
111
|
+
"-----END\nPRIVATE\nKEY-----\n-----BEGIN\nCERTIFICATE-----",
|
112
|
+
"-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----",
|
113
|
+
)
|
114
|
+
client_cert = client_cert.replace("-----END\nCERTIFICATE-----", "-----END CERTIFICATE-----")
|
115
|
+
with tempfile.NamedTemporaryFile(delete=False) as client_cert_file:
|
116
|
+
client_cert_file.write(client_cert.encode("utf-8"))
|
117
|
+
client_cert_path = client_cert_file.name
|
118
|
+
|
119
|
+
except Exception as e:
|
120
|
+
msg = f"Failed to write certificate to temporary file: {e}"
|
121
|
+
raise ValueError(msg) from e
|
122
|
+
|
123
|
+
try:
|
124
|
+
mongo_client: MongoClient = (
|
125
|
+
MongoClient(
|
126
|
+
self.mongodb_atlas_cluster_uri,
|
127
|
+
tls=True,
|
128
|
+
tlsCertificateKeyFile=client_cert_path,
|
129
|
+
tlsCAFile=certifi.where(),
|
130
|
+
)
|
131
|
+
if self.enable_mtls
|
132
|
+
else MongoClient(self.mongodb_atlas_cluster_uri)
|
133
|
+
)
|
134
|
+
|
135
|
+
collection = mongo_client[self.db_name][self.collection_name]
|
136
|
+
|
137
|
+
except Exception as e:
|
138
|
+
msg = f"Failed to connect to MongoDB Atlas: {e}"
|
139
|
+
raise ValueError(msg) from e
|
140
|
+
|
141
|
+
# Convert DataFrame to Data if needed using parent's method
|
142
|
+
self.ingest_data = self._prepare_ingest_data()
|
143
|
+
|
144
|
+
documents = []
|
145
|
+
for _input in self.ingest_data or []:
|
146
|
+
if isinstance(_input, Data):
|
147
|
+
documents.append(_input.to_lc_document())
|
148
|
+
else:
|
149
|
+
documents.append(_input)
|
150
|
+
|
151
|
+
if documents:
|
152
|
+
self.__insert_mode(collection)
|
153
|
+
|
154
|
+
return MongoDBAtlasVectorSearch.from_documents(
|
155
|
+
documents=documents, embedding=self.embedding, collection=collection, index_name=self.index_name
|
156
|
+
)
|
157
|
+
return MongoDBAtlasVectorSearch(embedding=self.embedding, collection=collection, index_name=self.index_name)
|
158
|
+
|
159
|
+
def search_documents(self) -> list[Data]:
|
160
|
+
from bson.objectid import ObjectId
|
161
|
+
|
162
|
+
vector_store = self.build_vector_store()
|
163
|
+
|
164
|
+
self.verify_search_index(vector_store._collection)
|
165
|
+
|
166
|
+
if self.search_query and isinstance(self.search_query, str):
|
167
|
+
docs = vector_store.similarity_search(
|
168
|
+
query=self.search_query,
|
169
|
+
k=self.number_of_results,
|
170
|
+
)
|
171
|
+
for doc in docs:
|
172
|
+
doc.metadata = {
|
173
|
+
key: str(value) if isinstance(value, ObjectId) else value for key, value in doc.metadata.items()
|
174
|
+
}
|
175
|
+
|
176
|
+
data = docs_to_data(docs)
|
177
|
+
self.status = data
|
178
|
+
return data
|
179
|
+
return []
|
180
|
+
|
181
|
+
def __insert_mode(self, collection: Collection) -> None:
|
182
|
+
if self.insert_mode == "overwrite":
|
183
|
+
collection.delete_many({}) # Delete all documents while preserving collection structure
|
184
|
+
|
185
|
+
def verify_search_index(self, collection: Collection) -> None:
|
186
|
+
"""Verify if the search index exists, if not, create it.
|
187
|
+
|
188
|
+
Args:
|
189
|
+
collection (Collection): The collection to verify the search index on.
|
190
|
+
"""
|
191
|
+
indexes = collection.list_search_indexes()
|
192
|
+
|
193
|
+
index_names_types = {idx["name"]: idx["type"] for idx in indexes}
|
194
|
+
index_names = list(index_names_types.keys())
|
195
|
+
index_type = index_names_types.get(self.index_name)
|
196
|
+
if self.index_name not in index_names and index_type != "vectorSearch":
|
197
|
+
collection.create_search_index(self.__create_index_definition())
|
198
|
+
|
199
|
+
time.sleep(20) # Give some time for index to be ready
|
200
|
+
|
201
|
+
def __create_index_definition(self) -> SearchIndexModel:
|
202
|
+
fields = [
|
203
|
+
{
|
204
|
+
"type": "vector",
|
205
|
+
"path": self.index_field,
|
206
|
+
"numDimensions": self.number_dimensions,
|
207
|
+
"similarity": self.similarity,
|
208
|
+
"quantization": self.quantization,
|
209
|
+
}
|
210
|
+
]
|
211
|
+
if self.filter_field:
|
212
|
+
fields.append({"type": "filter", "path": self.filter_field})
|
213
|
+
return SearchIndexModel(definition={"fields": fields}, name=self.index_name, type="vectorSearch")
|
@@ -0,0 +1,243 @@
|
|
1
|
+
import json
|
2
|
+
from typing import Any
|
3
|
+
|
4
|
+
from langchain_community.vectorstores import OpenSearchVectorSearch
|
5
|
+
|
6
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
7
|
+
from lfx.base.vectorstores.vector_store_connection_decorator import vector_store_connection
|
8
|
+
from lfx.io import (
|
9
|
+
BoolInput,
|
10
|
+
DropdownInput,
|
11
|
+
FloatInput,
|
12
|
+
HandleInput,
|
13
|
+
IntInput,
|
14
|
+
MultilineInput,
|
15
|
+
SecretStrInput,
|
16
|
+
StrInput,
|
17
|
+
)
|
18
|
+
from lfx.schema.data import Data
|
19
|
+
|
20
|
+
|
21
|
+
@vector_store_connection
|
22
|
+
class OpenSearchVectorStoreComponent(LCVectorStoreComponent):
|
23
|
+
"""OpenSearch Vector Store with advanced, customizable search capabilities."""
|
24
|
+
|
25
|
+
display_name: str = "OpenSearch"
|
26
|
+
description: str = "OpenSearch Vector Store with advanced, customizable search capabilities."
|
27
|
+
name = "OpenSearch"
|
28
|
+
icon = "OpenSearch"
|
29
|
+
|
30
|
+
inputs = [
|
31
|
+
StrInput(
|
32
|
+
name="opensearch_url",
|
33
|
+
display_name="OpenSearch URL",
|
34
|
+
value="http://localhost:9200",
|
35
|
+
info="URL for OpenSearch cluster (e.g. https://192.168.1.1:9200).",
|
36
|
+
),
|
37
|
+
StrInput(
|
38
|
+
name="index_name",
|
39
|
+
display_name="Index Name",
|
40
|
+
value="langflow",
|
41
|
+
info="The index name where the vectors will be stored in OpenSearch cluster.",
|
42
|
+
),
|
43
|
+
*LCVectorStoreComponent.inputs,
|
44
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
45
|
+
DropdownInput(
|
46
|
+
name="search_type",
|
47
|
+
display_name="Search Type",
|
48
|
+
options=["similarity", "similarity_score_threshold", "mmr"],
|
49
|
+
value="similarity",
|
50
|
+
advanced=True,
|
51
|
+
),
|
52
|
+
IntInput(
|
53
|
+
name="number_of_results",
|
54
|
+
display_name="Number of Results",
|
55
|
+
info="Number of results to return.",
|
56
|
+
advanced=True,
|
57
|
+
value=4,
|
58
|
+
),
|
59
|
+
FloatInput(
|
60
|
+
name="search_score_threshold",
|
61
|
+
display_name="Search Score Threshold",
|
62
|
+
info="Minimum similarity score threshold for search results.",
|
63
|
+
value=0.0,
|
64
|
+
advanced=True,
|
65
|
+
),
|
66
|
+
StrInput(
|
67
|
+
name="username",
|
68
|
+
display_name="Username",
|
69
|
+
value="admin",
|
70
|
+
advanced=True,
|
71
|
+
),
|
72
|
+
SecretStrInput(
|
73
|
+
name="password",
|
74
|
+
display_name="Password",
|
75
|
+
value="admin",
|
76
|
+
advanced=True,
|
77
|
+
),
|
78
|
+
BoolInput(
|
79
|
+
name="use_ssl",
|
80
|
+
display_name="Use SSL",
|
81
|
+
value=True,
|
82
|
+
advanced=True,
|
83
|
+
),
|
84
|
+
BoolInput(
|
85
|
+
name="verify_certs",
|
86
|
+
display_name="Verify Certificates",
|
87
|
+
value=False,
|
88
|
+
advanced=True,
|
89
|
+
),
|
90
|
+
MultilineInput(
|
91
|
+
name="hybrid_search_query",
|
92
|
+
display_name="Hybrid Search Query",
|
93
|
+
value="",
|
94
|
+
advanced=True,
|
95
|
+
info=(
|
96
|
+
"Provide a custom hybrid search query in JSON format. This allows you to combine "
|
97
|
+
"vector similarity and keyword matching."
|
98
|
+
),
|
99
|
+
),
|
100
|
+
]
|
101
|
+
|
102
|
+
@check_cached_vector_store
|
103
|
+
def build_vector_store(self) -> OpenSearchVectorSearch:
|
104
|
+
"""Builds the OpenSearch Vector Store object."""
|
105
|
+
try:
|
106
|
+
from langchain_community.vectorstores import OpenSearchVectorSearch
|
107
|
+
except ImportError as e:
|
108
|
+
error_message = f"Failed to import required modules: {e}"
|
109
|
+
self.log(error_message)
|
110
|
+
raise ImportError(error_message) from e
|
111
|
+
|
112
|
+
try:
|
113
|
+
opensearch = OpenSearchVectorSearch(
|
114
|
+
index_name=self.index_name,
|
115
|
+
embedding_function=self.embedding,
|
116
|
+
opensearch_url=self.opensearch_url,
|
117
|
+
http_auth=(self.username, self.password),
|
118
|
+
use_ssl=self.use_ssl,
|
119
|
+
verify_certs=self.verify_certs,
|
120
|
+
ssl_assert_hostname=False,
|
121
|
+
ssl_show_warn=False,
|
122
|
+
)
|
123
|
+
except Exception as e:
|
124
|
+
error_message = f"Failed to create OpenSearchVectorSearch instance: {e}"
|
125
|
+
self.log(error_message)
|
126
|
+
raise RuntimeError(error_message) from e
|
127
|
+
|
128
|
+
if self.ingest_data:
|
129
|
+
self._add_documents_to_vector_store(opensearch)
|
130
|
+
|
131
|
+
return opensearch
|
132
|
+
|
133
|
+
def _add_documents_to_vector_store(self, vector_store: "OpenSearchVectorSearch") -> None:
|
134
|
+
"""Adds documents to the Vector Store."""
|
135
|
+
# Convert DataFrame to Data if needed using parent's method
|
136
|
+
self.ingest_data = self._prepare_ingest_data()
|
137
|
+
|
138
|
+
documents = []
|
139
|
+
for _input in self.ingest_data or []:
|
140
|
+
if isinstance(_input, Data):
|
141
|
+
documents.append(_input.to_lc_document())
|
142
|
+
else:
|
143
|
+
error_message = f"Expected Data object, got {type(_input)}"
|
144
|
+
self.log(error_message)
|
145
|
+
raise TypeError(error_message)
|
146
|
+
|
147
|
+
if documents and self.embedding is not None:
|
148
|
+
self.log(f"Adding {len(documents)} documents to the Vector Store.")
|
149
|
+
try:
|
150
|
+
vector_store.add_documents(documents)
|
151
|
+
except Exception as e:
|
152
|
+
error_message = f"Error adding documents to Vector Store: {e}"
|
153
|
+
self.log(error_message)
|
154
|
+
raise RuntimeError(error_message) from e
|
155
|
+
else:
|
156
|
+
self.log("No documents to add to the Vector Store.")
|
157
|
+
|
158
|
+
def search(self, query: str | None = None) -> list[dict[str, Any]]:
|
159
|
+
"""Search for similar documents in the vector store or retrieve all documents if no query is provided."""
|
160
|
+
try:
|
161
|
+
vector_store = self.build_vector_store()
|
162
|
+
|
163
|
+
query = query or ""
|
164
|
+
|
165
|
+
if self.hybrid_search_query.strip():
|
166
|
+
try:
|
167
|
+
hybrid_query = json.loads(self.hybrid_search_query)
|
168
|
+
except json.JSONDecodeError as e:
|
169
|
+
error_message = f"Invalid hybrid search query JSON: {e}"
|
170
|
+
self.log(error_message)
|
171
|
+
raise ValueError(error_message) from e
|
172
|
+
|
173
|
+
results = vector_store.client.search(index=self.index_name, body=hybrid_query)
|
174
|
+
|
175
|
+
processed_results = []
|
176
|
+
for hit in results.get("hits", {}).get("hits", []):
|
177
|
+
source = hit.get("_source", {})
|
178
|
+
text = source.get("text", "")
|
179
|
+
metadata = source.get("metadata", {})
|
180
|
+
|
181
|
+
if isinstance(text, dict):
|
182
|
+
text = text.get("text", "")
|
183
|
+
|
184
|
+
processed_results.append(
|
185
|
+
{
|
186
|
+
"page_content": text,
|
187
|
+
"metadata": metadata,
|
188
|
+
}
|
189
|
+
)
|
190
|
+
return processed_results
|
191
|
+
|
192
|
+
search_kwargs = {"k": self.number_of_results}
|
193
|
+
search_type = self.search_type.lower()
|
194
|
+
|
195
|
+
if search_type == "similarity":
|
196
|
+
results = vector_store.similarity_search(query, **search_kwargs)
|
197
|
+
return [{"page_content": doc.page_content, "metadata": doc.metadata} for doc in results]
|
198
|
+
if search_type == "similarity_score_threshold":
|
199
|
+
search_kwargs["score_threshold"] = self.search_score_threshold
|
200
|
+
results = vector_store.similarity_search_with_relevance_scores(query, **search_kwargs)
|
201
|
+
return [
|
202
|
+
{
|
203
|
+
"page_content": doc.page_content,
|
204
|
+
"metadata": doc.metadata,
|
205
|
+
"score": score,
|
206
|
+
}
|
207
|
+
for doc, score in results
|
208
|
+
]
|
209
|
+
if search_type == "mmr":
|
210
|
+
results = vector_store.max_marginal_relevance_search(query, **search_kwargs)
|
211
|
+
return [{"page_content": doc.page_content, "metadata": doc.metadata} for doc in results]
|
212
|
+
|
213
|
+
except Exception as e:
|
214
|
+
error_message = f"Error during search: {e}"
|
215
|
+
self.log(error_message)
|
216
|
+
raise RuntimeError(error_message) from e
|
217
|
+
|
218
|
+
error_message = f"Error during search. Invalid search type: {self.search_type}"
|
219
|
+
self.log(error_message)
|
220
|
+
raise ValueError(error_message)
|
221
|
+
|
222
|
+
def search_documents(self) -> list[Data]:
|
223
|
+
"""Search for documents in the vector store based on the search input.
|
224
|
+
|
225
|
+
If no search input is provided, retrieve all documents.
|
226
|
+
"""
|
227
|
+
try:
|
228
|
+
query = self.search_query.strip() if self.search_query else None
|
229
|
+
results = self.search(query)
|
230
|
+
retrieved_data = [
|
231
|
+
Data(
|
232
|
+
file_path=result["metadata"].get("file_path", ""),
|
233
|
+
text=result["page_content"],
|
234
|
+
)
|
235
|
+
for result in results
|
236
|
+
]
|
237
|
+
except Exception as e:
|
238
|
+
error_message = f"Error during document search: {e}"
|
239
|
+
self.log(error_message)
|
240
|
+
raise RuntimeError(error_message) from e
|
241
|
+
|
242
|
+
self.status = retrieved_data
|
243
|
+
return retrieved_data
|
@@ -0,0 +1,72 @@
|
|
1
|
+
from langchain_community.vectorstores import PGVector
|
2
|
+
|
3
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
4
|
+
from lfx.helpers.data import docs_to_data
|
5
|
+
from lfx.io import HandleInput, IntInput, SecretStrInput, StrInput
|
6
|
+
from lfx.schema.data import Data
|
7
|
+
from lfx.utils.connection_string_parser import transform_connection_string
|
8
|
+
|
9
|
+
|
10
|
+
class PGVectorStoreComponent(LCVectorStoreComponent):
|
11
|
+
display_name = "PGVector"
|
12
|
+
description = "PGVector Vector Store with search capabilities"
|
13
|
+
name = "pgvector"
|
14
|
+
icon = "cpu"
|
15
|
+
|
16
|
+
inputs = [
|
17
|
+
SecretStrInput(name="pg_server_url", display_name="PostgreSQL Server Connection String", required=True),
|
18
|
+
StrInput(name="collection_name", display_name="Table", required=True),
|
19
|
+
*LCVectorStoreComponent.inputs,
|
20
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"], required=True),
|
21
|
+
IntInput(
|
22
|
+
name="number_of_results",
|
23
|
+
display_name="Number of Results",
|
24
|
+
info="Number of results to return.",
|
25
|
+
value=4,
|
26
|
+
advanced=True,
|
27
|
+
),
|
28
|
+
]
|
29
|
+
|
30
|
+
@check_cached_vector_store
|
31
|
+
def build_vector_store(self) -> PGVector:
|
32
|
+
# Convert DataFrame to Data if needed using parent's method
|
33
|
+
self.ingest_data = self._prepare_ingest_data()
|
34
|
+
|
35
|
+
documents = []
|
36
|
+
for _input in self.ingest_data or []:
|
37
|
+
if isinstance(_input, Data):
|
38
|
+
documents.append(_input.to_lc_document())
|
39
|
+
else:
|
40
|
+
documents.append(_input)
|
41
|
+
|
42
|
+
connection_string_parsed = transform_connection_string(self.pg_server_url)
|
43
|
+
|
44
|
+
if documents:
|
45
|
+
pgvector = PGVector.from_documents(
|
46
|
+
embedding=self.embedding,
|
47
|
+
documents=documents,
|
48
|
+
collection_name=self.collection_name,
|
49
|
+
connection_string=connection_string_parsed,
|
50
|
+
)
|
51
|
+
else:
|
52
|
+
pgvector = PGVector.from_existing_index(
|
53
|
+
embedding=self.embedding,
|
54
|
+
collection_name=self.collection_name,
|
55
|
+
connection_string=connection_string_parsed,
|
56
|
+
)
|
57
|
+
|
58
|
+
return pgvector
|
59
|
+
|
60
|
+
def search_documents(self) -> list[Data]:
|
61
|
+
vector_store = self.build_vector_store()
|
62
|
+
|
63
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
64
|
+
docs = vector_store.similarity_search(
|
65
|
+
query=self.search_query,
|
66
|
+
k=self.number_of_results,
|
67
|
+
)
|
68
|
+
|
69
|
+
data = docs_to_data(docs)
|
70
|
+
self.status = data
|
71
|
+
return data
|
72
|
+
return []
|
@@ -0,0 +1,134 @@
|
|
1
|
+
import numpy as np
|
2
|
+
from langchain_core.vectorstores import VectorStore
|
3
|
+
|
4
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
5
|
+
from lfx.helpers.data import docs_to_data
|
6
|
+
from lfx.io import DropdownInput, HandleInput, IntInput, SecretStrInput, StrInput
|
7
|
+
from lfx.schema.data import Data
|
8
|
+
|
9
|
+
|
10
|
+
class PineconeVectorStoreComponent(LCVectorStoreComponent):
|
11
|
+
display_name = "Pinecone"
|
12
|
+
description = "Pinecone Vector Store with search capabilities"
|
13
|
+
name = "Pinecone"
|
14
|
+
icon = "Pinecone"
|
15
|
+
inputs = [
|
16
|
+
StrInput(name="index_name", display_name="Index Name", required=True),
|
17
|
+
StrInput(name="namespace", display_name="Namespace", info="Namespace for the index."),
|
18
|
+
DropdownInput(
|
19
|
+
name="distance_strategy",
|
20
|
+
display_name="Distance Strategy",
|
21
|
+
options=["Cosine", "Euclidean", "Dot Product"],
|
22
|
+
value="Cosine",
|
23
|
+
advanced=True,
|
24
|
+
),
|
25
|
+
SecretStrInput(name="pinecone_api_key", display_name="Pinecone API Key", required=True),
|
26
|
+
StrInput(
|
27
|
+
name="text_key",
|
28
|
+
display_name="Text Key",
|
29
|
+
info="Key in the record to use as text.",
|
30
|
+
value="text",
|
31
|
+
advanced=True,
|
32
|
+
),
|
33
|
+
*LCVectorStoreComponent.inputs,
|
34
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
35
|
+
IntInput(
|
36
|
+
name="number_of_results",
|
37
|
+
display_name="Number of Results",
|
38
|
+
info="Number of results to return.",
|
39
|
+
value=4,
|
40
|
+
advanced=True,
|
41
|
+
),
|
42
|
+
]
|
43
|
+
|
44
|
+
@check_cached_vector_store
|
45
|
+
def build_vector_store(self) -> VectorStore:
|
46
|
+
"""Build and return a Pinecone vector store instance."""
|
47
|
+
try:
|
48
|
+
from langchain_pinecone import PineconeVectorStore
|
49
|
+
except ImportError as e:
|
50
|
+
msg = "langchain-pinecone is not installed. Please install it with `pip install langchain-pinecone`."
|
51
|
+
raise ValueError(msg) from e
|
52
|
+
|
53
|
+
try:
|
54
|
+
from langchain_pinecone._utilities import DistanceStrategy
|
55
|
+
|
56
|
+
# Wrap the embedding model to ensure float32 output
|
57
|
+
wrapped_embeddings = Float32Embeddings(self.embedding)
|
58
|
+
|
59
|
+
# Convert distance strategy
|
60
|
+
distance_strategy = self.distance_strategy.replace(" ", "_").upper()
|
61
|
+
distance_strategy = DistanceStrategy[distance_strategy]
|
62
|
+
|
63
|
+
# Initialize Pinecone instance with wrapped embeddings
|
64
|
+
pinecone = PineconeVectorStore(
|
65
|
+
index_name=self.index_name,
|
66
|
+
embedding=wrapped_embeddings, # Use wrapped embeddings
|
67
|
+
text_key=self.text_key,
|
68
|
+
namespace=self.namespace,
|
69
|
+
distance_strategy=distance_strategy,
|
70
|
+
pinecone_api_key=self.pinecone_api_key,
|
71
|
+
)
|
72
|
+
except Exception as e:
|
73
|
+
error_msg = "Error building Pinecone vector store"
|
74
|
+
raise ValueError(error_msg) from e
|
75
|
+
else:
|
76
|
+
self.ingest_data = self._prepare_ingest_data()
|
77
|
+
|
78
|
+
# Process documents if any
|
79
|
+
documents = []
|
80
|
+
if self.ingest_data:
|
81
|
+
# Convert DataFrame to Data if needed using parent's method
|
82
|
+
|
83
|
+
for doc in self.ingest_data:
|
84
|
+
if isinstance(doc, Data):
|
85
|
+
documents.append(doc.to_lc_document())
|
86
|
+
else:
|
87
|
+
documents.append(doc)
|
88
|
+
|
89
|
+
if documents:
|
90
|
+
pinecone.add_documents(documents)
|
91
|
+
|
92
|
+
return pinecone
|
93
|
+
|
94
|
+
def search_documents(self) -> list[Data]:
|
95
|
+
"""Search documents in the vector store."""
|
96
|
+
try:
|
97
|
+
if not self.search_query or not isinstance(self.search_query, str) or not self.search_query.strip():
|
98
|
+
return []
|
99
|
+
|
100
|
+
vector_store = self.build_vector_store()
|
101
|
+
docs = vector_store.similarity_search(
|
102
|
+
query=self.search_query,
|
103
|
+
k=self.number_of_results,
|
104
|
+
)
|
105
|
+
except Exception as e:
|
106
|
+
error_msg = "Error searching documents"
|
107
|
+
raise ValueError(error_msg) from e
|
108
|
+
else:
|
109
|
+
data = docs_to_data(docs)
|
110
|
+
self.status = data
|
111
|
+
return data
|
112
|
+
|
113
|
+
|
114
|
+
class Float32Embeddings:
|
115
|
+
"""Wrapper class to ensure float32 embeddings."""
|
116
|
+
|
117
|
+
def __init__(self, base_embeddings):
|
118
|
+
self.base_embeddings = base_embeddings
|
119
|
+
|
120
|
+
def embed_documents(self, texts):
|
121
|
+
embeddings = self.base_embeddings.embed_documents(texts)
|
122
|
+
if isinstance(embeddings, np.ndarray):
|
123
|
+
return [[self._force_float32(x) for x in vec] for vec in embeddings]
|
124
|
+
return [[self._force_float32(x) for x in vec] for vec in embeddings]
|
125
|
+
|
126
|
+
def embed_query(self, text):
|
127
|
+
embedding = self.base_embeddings.embed_query(text)
|
128
|
+
if isinstance(embedding, np.ndarray):
|
129
|
+
return [self._force_float32(x) for x in embedding]
|
130
|
+
return [self._force_float32(x) for x in embedding]
|
131
|
+
|
132
|
+
def _force_float32(self, value):
|
133
|
+
"""Convert any numeric type to Python float."""
|
134
|
+
return float(np.float32(value))
|