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,117 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
from docling_core.types.doc import ImageRefMode
|
4
|
+
|
5
|
+
from lfx.base.data.docling_utils import extract_docling_documents
|
6
|
+
from lfx.custom import Component
|
7
|
+
from lfx.io import DropdownInput, HandleInput, MessageTextInput, Output, StrInput
|
8
|
+
from lfx.schema import Data, DataFrame
|
9
|
+
|
10
|
+
|
11
|
+
class ExportDoclingDocumentComponent(Component):
|
12
|
+
display_name: str = "Export DoclingDocument"
|
13
|
+
description: str = "Export DoclingDocument to markdown, html or other formats."
|
14
|
+
documentation = "https://docling-project.github.io/docling/"
|
15
|
+
icon = "Docling"
|
16
|
+
name = "ExportDoclingDocument"
|
17
|
+
|
18
|
+
inputs = [
|
19
|
+
HandleInput(
|
20
|
+
name="data_inputs",
|
21
|
+
display_name="Data or DataFrame",
|
22
|
+
info="The data with documents to export.",
|
23
|
+
input_types=["Data", "DataFrame"],
|
24
|
+
required=True,
|
25
|
+
),
|
26
|
+
DropdownInput(
|
27
|
+
name="export_format",
|
28
|
+
display_name="Export format",
|
29
|
+
options=["Markdown", "HTML", "Plaintext", "DocTags"],
|
30
|
+
info="Select the export format to convert the input.",
|
31
|
+
value="Markdown",
|
32
|
+
real_time_refresh=True,
|
33
|
+
),
|
34
|
+
DropdownInput(
|
35
|
+
name="image_mode",
|
36
|
+
display_name="Image export mode",
|
37
|
+
options=["placeholder", "embedded"],
|
38
|
+
info=(
|
39
|
+
"Specify how images are exported in the output. Placeholder will replace the images with a string, "
|
40
|
+
"whereas Embedded will include them as base64 encoded images."
|
41
|
+
),
|
42
|
+
value="placeholder",
|
43
|
+
),
|
44
|
+
StrInput(
|
45
|
+
name="md_image_placeholder",
|
46
|
+
display_name="Image placeholder",
|
47
|
+
info="Specify the image placeholder for markdown exports.",
|
48
|
+
value="<!-- image -->",
|
49
|
+
advanced=True,
|
50
|
+
),
|
51
|
+
StrInput(
|
52
|
+
name="md_page_break_placeholder",
|
53
|
+
display_name="Page break placeholder",
|
54
|
+
info="Add this placeholder betweek pages in the markdown output.",
|
55
|
+
value="",
|
56
|
+
advanced=True,
|
57
|
+
),
|
58
|
+
MessageTextInput(
|
59
|
+
name="doc_key",
|
60
|
+
display_name="Doc Key",
|
61
|
+
info="The key to use for the DoclingDocument column.",
|
62
|
+
value="doc",
|
63
|
+
advanced=True,
|
64
|
+
),
|
65
|
+
]
|
66
|
+
|
67
|
+
outputs = [
|
68
|
+
Output(display_name="Exported data", name="data", method="export_document"),
|
69
|
+
Output(display_name="DataFrame", name="dataframe", method="as_dataframe"),
|
70
|
+
]
|
71
|
+
|
72
|
+
def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None) -> dict:
|
73
|
+
if field_name == "export_format" and field_value == "Markdown":
|
74
|
+
build_config["md_image_placeholder"]["show"] = True
|
75
|
+
build_config["md_page_break_placeholder"]["show"] = True
|
76
|
+
build_config["image_mode"]["show"] = True
|
77
|
+
elif field_name == "export_format" and field_value == "HTML":
|
78
|
+
build_config["md_image_placeholder"]["show"] = False
|
79
|
+
build_config["md_page_break_placeholder"]["show"] = False
|
80
|
+
build_config["image_mode"]["show"] = True
|
81
|
+
elif field_name == "export_format" and field_value in {"Plaintext", "DocTags"}:
|
82
|
+
build_config["md_image_placeholder"]["show"] = False
|
83
|
+
build_config["md_page_break_placeholder"]["show"] = False
|
84
|
+
build_config["image_mode"]["show"] = False
|
85
|
+
|
86
|
+
return build_config
|
87
|
+
|
88
|
+
def export_document(self) -> list[Data]:
|
89
|
+
documents = extract_docling_documents(self.data_inputs, self.doc_key)
|
90
|
+
|
91
|
+
results: list[Data] = []
|
92
|
+
try:
|
93
|
+
image_mode = ImageRefMode(self.image_mode)
|
94
|
+
for doc in documents:
|
95
|
+
content = ""
|
96
|
+
if self.export_format == "Markdown":
|
97
|
+
content = doc.export_to_markdown(
|
98
|
+
image_mode=image_mode,
|
99
|
+
image_placeholder=self.md_image_placeholder,
|
100
|
+
page_break_placeholder=self.md_page_break_placeholder,
|
101
|
+
)
|
102
|
+
elif self.export_format == "HTML":
|
103
|
+
content = doc.export_to_html(image_mode=image_mode)
|
104
|
+
elif self.export_format == "Plaintext":
|
105
|
+
content = doc.export_to_text()
|
106
|
+
elif self.export_format == "DocTags":
|
107
|
+
content = doc.export_to_doctags()
|
108
|
+
|
109
|
+
results.append(Data(text=content))
|
110
|
+
except Exception as e:
|
111
|
+
msg = f"Error splitting text: {e}"
|
112
|
+
raise TypeError(msg) from e
|
113
|
+
|
114
|
+
return results
|
115
|
+
|
116
|
+
def as_dataframe(self) -> DataFrame:
|
117
|
+
return DataFrame(self.export_document())
|
@@ -0,0 +1,92 @@
|
|
1
|
+
from langchain_community.tools import DuckDuckGoSearchRun
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.inputs.inputs import IntInput, MessageTextInput
|
5
|
+
from lfx.schema.data import Data
|
6
|
+
from lfx.schema.dataframe import DataFrame
|
7
|
+
from lfx.template.field.base import Output
|
8
|
+
|
9
|
+
|
10
|
+
class DuckDuckGoSearchComponent(Component):
|
11
|
+
"""Component for performing web searches using DuckDuckGo."""
|
12
|
+
|
13
|
+
display_name = "DuckDuckGo Search"
|
14
|
+
description = "Search the web using DuckDuckGo with customizable result limits"
|
15
|
+
documentation = "https://python.langchain.com/docs/integrations/tools/ddg"
|
16
|
+
icon = "DuckDuckGo"
|
17
|
+
|
18
|
+
inputs = [
|
19
|
+
MessageTextInput(
|
20
|
+
name="input_value",
|
21
|
+
display_name="Search Query",
|
22
|
+
required=True,
|
23
|
+
info="The search query to execute with DuckDuckGo",
|
24
|
+
tool_mode=True,
|
25
|
+
),
|
26
|
+
IntInput(
|
27
|
+
name="max_results",
|
28
|
+
display_name="Max Results",
|
29
|
+
value=5,
|
30
|
+
required=False,
|
31
|
+
advanced=True,
|
32
|
+
info="Maximum number of search results to return",
|
33
|
+
),
|
34
|
+
IntInput(
|
35
|
+
name="max_snippet_length",
|
36
|
+
display_name="Max Snippet Length",
|
37
|
+
value=100,
|
38
|
+
required=False,
|
39
|
+
advanced=True,
|
40
|
+
info="Maximum length of each result snippet",
|
41
|
+
),
|
42
|
+
]
|
43
|
+
|
44
|
+
outputs = [
|
45
|
+
Output(display_name="DataFrame", name="dataframe", method="fetch_content_dataframe"),
|
46
|
+
]
|
47
|
+
|
48
|
+
def _build_wrapper(self) -> DuckDuckGoSearchRun:
|
49
|
+
"""Build the DuckDuckGo search wrapper."""
|
50
|
+
return DuckDuckGoSearchRun()
|
51
|
+
|
52
|
+
def run_model(self) -> DataFrame:
|
53
|
+
return self.fetch_content_dataframe()
|
54
|
+
|
55
|
+
def fetch_content(self) -> list[Data]:
|
56
|
+
"""Execute the search and return results as Data objects."""
|
57
|
+
try:
|
58
|
+
wrapper = self._build_wrapper()
|
59
|
+
|
60
|
+
full_results = wrapper.run(f"{self.input_value} (site:*)")
|
61
|
+
|
62
|
+
result_list = full_results.split("\n")[: self.max_results]
|
63
|
+
|
64
|
+
data_results = []
|
65
|
+
for result in result_list:
|
66
|
+
if result.strip():
|
67
|
+
snippet = result[: self.max_snippet_length]
|
68
|
+
data_results.append(
|
69
|
+
Data(
|
70
|
+
text=snippet,
|
71
|
+
data={
|
72
|
+
"content": result,
|
73
|
+
"snippet": snippet,
|
74
|
+
},
|
75
|
+
)
|
76
|
+
)
|
77
|
+
except (ValueError, AttributeError) as e:
|
78
|
+
error_data = [Data(text=str(e), data={"error": str(e)})]
|
79
|
+
self.status = error_data
|
80
|
+
return error_data
|
81
|
+
else:
|
82
|
+
self.status = data_results
|
83
|
+
return data_results
|
84
|
+
|
85
|
+
def fetch_content_dataframe(self) -> DataFrame:
|
86
|
+
"""Convert the search results to a DataFrame.
|
87
|
+
|
88
|
+
Returns:
|
89
|
+
DataFrame: A DataFrame containing the search results.
|
90
|
+
"""
|
91
|
+
data = self.fetch_content()
|
92
|
+
return DataFrame(data)
|
@@ -0,0 +1,37 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.components._importing import import_mod
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from .elasticsearch import ElasticsearchVectorStoreComponent
|
9
|
+
from .opensearch import OpenSearchVectorStoreComponent
|
10
|
+
|
11
|
+
_dynamic_imports = {
|
12
|
+
"ElasticsearchVectorStoreComponent": "elasticsearch",
|
13
|
+
"OpenSearchVectorStoreComponent": "opensearch",
|
14
|
+
}
|
15
|
+
|
16
|
+
__all__ = [
|
17
|
+
"ElasticsearchVectorStoreComponent",
|
18
|
+
"OpenSearchVectorStoreComponent",
|
19
|
+
]
|
20
|
+
|
21
|
+
|
22
|
+
def __getattr__(attr_name: str) -> Any:
|
23
|
+
"""Lazily import Elastic components on attribute access."""
|
24
|
+
if attr_name not in _dynamic_imports:
|
25
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
26
|
+
raise AttributeError(msg)
|
27
|
+
try:
|
28
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
29
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
30
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
31
|
+
raise AttributeError(msg) from e
|
32
|
+
globals()[attr_name] = result
|
33
|
+
return result
|
34
|
+
|
35
|
+
|
36
|
+
def __dir__() -> list[str]:
|
37
|
+
return list(__all__)
|
@@ -0,0 +1,267 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
from elasticsearch import Elasticsearch
|
4
|
+
from langchain.schema import Document
|
5
|
+
from langchain_elasticsearch import ElasticsearchStore
|
6
|
+
|
7
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
8
|
+
from lfx.io import (
|
9
|
+
BoolInput,
|
10
|
+
DropdownInput,
|
11
|
+
FloatInput,
|
12
|
+
HandleInput,
|
13
|
+
IntInput,
|
14
|
+
SecretStrInput,
|
15
|
+
StrInput,
|
16
|
+
)
|
17
|
+
from lfx.schema.data import Data
|
18
|
+
|
19
|
+
|
20
|
+
class ElasticsearchVectorStoreComponent(LCVectorStoreComponent):
|
21
|
+
"""Elasticsearch Vector Store with with advanced, customizable search capabilities."""
|
22
|
+
|
23
|
+
display_name: str = "Elasticsearch"
|
24
|
+
description: str = "Elasticsearch Vector Store with with advanced, customizable search capabilities."
|
25
|
+
name = "Elasticsearch"
|
26
|
+
icon = "ElasticsearchStore"
|
27
|
+
|
28
|
+
inputs = [
|
29
|
+
StrInput(
|
30
|
+
name="elasticsearch_url",
|
31
|
+
display_name="Elasticsearch URL",
|
32
|
+
value="http://localhost:9200",
|
33
|
+
info="URL for self-managed Elasticsearch deployments (e.g., http://localhost:9200). "
|
34
|
+
"Do not use with Elastic Cloud deployments, use Elastic Cloud ID instead.",
|
35
|
+
),
|
36
|
+
SecretStrInput(
|
37
|
+
name="cloud_id",
|
38
|
+
display_name="Elastic Cloud ID",
|
39
|
+
value="",
|
40
|
+
info="Use this for Elastic Cloud deployments. Do not use together with 'Elasticsearch URL'.",
|
41
|
+
),
|
42
|
+
StrInput(
|
43
|
+
name="index_name",
|
44
|
+
display_name="Index Name",
|
45
|
+
value="langflow",
|
46
|
+
info="The index name where the vectors will be stored in Elasticsearch cluster.",
|
47
|
+
),
|
48
|
+
*LCVectorStoreComponent.inputs,
|
49
|
+
StrInput(
|
50
|
+
name="username",
|
51
|
+
display_name="Username",
|
52
|
+
value="",
|
53
|
+
advanced=False,
|
54
|
+
info=(
|
55
|
+
"Elasticsearch username (e.g., 'elastic'). "
|
56
|
+
"Required for both local and Elastic Cloud setups unless API keys are used."
|
57
|
+
),
|
58
|
+
),
|
59
|
+
SecretStrInput(
|
60
|
+
name="password",
|
61
|
+
display_name="Password",
|
62
|
+
value="",
|
63
|
+
advanced=False,
|
64
|
+
info=(
|
65
|
+
"Elasticsearch password for the specified user. "
|
66
|
+
"Required for both local and Elastic Cloud setups unless API keys are used."
|
67
|
+
),
|
68
|
+
),
|
69
|
+
HandleInput(
|
70
|
+
name="embedding",
|
71
|
+
display_name="Embedding",
|
72
|
+
input_types=["Embeddings"],
|
73
|
+
),
|
74
|
+
DropdownInput(
|
75
|
+
name="search_type",
|
76
|
+
display_name="Search Type",
|
77
|
+
options=["similarity", "mmr"],
|
78
|
+
value="similarity",
|
79
|
+
advanced=True,
|
80
|
+
),
|
81
|
+
IntInput(
|
82
|
+
name="number_of_results",
|
83
|
+
display_name="Number of Results",
|
84
|
+
info="Number of results to return.",
|
85
|
+
advanced=True,
|
86
|
+
value=4,
|
87
|
+
),
|
88
|
+
FloatInput(
|
89
|
+
name="search_score_threshold",
|
90
|
+
display_name="Search Score Threshold",
|
91
|
+
info="Minimum similarity score threshold for search results.",
|
92
|
+
value=0.0,
|
93
|
+
advanced=True,
|
94
|
+
),
|
95
|
+
SecretStrInput(
|
96
|
+
name="api_key",
|
97
|
+
display_name="Elastic API Key",
|
98
|
+
value="",
|
99
|
+
advanced=True,
|
100
|
+
info="API Key for Elastic Cloud authentication. If used, 'username' and 'password' are not required.",
|
101
|
+
),
|
102
|
+
BoolInput(
|
103
|
+
name="verify_certs",
|
104
|
+
display_name="Verify SSL Certificates",
|
105
|
+
value=True,
|
106
|
+
advanced=True,
|
107
|
+
info="Whether to verify SSL certificates when connecting to Elasticsearch.",
|
108
|
+
),
|
109
|
+
]
|
110
|
+
|
111
|
+
@check_cached_vector_store
|
112
|
+
def build_vector_store(self) -> ElasticsearchStore:
|
113
|
+
"""Builds the Elasticsearch Vector Store object."""
|
114
|
+
if self.cloud_id and self.elasticsearch_url:
|
115
|
+
msg = (
|
116
|
+
"Both 'cloud_id' and 'elasticsearch_url' provided. "
|
117
|
+
"Please use only one based on your deployment (Cloud or Local)."
|
118
|
+
)
|
119
|
+
raise ValueError(msg)
|
120
|
+
|
121
|
+
es_params = {
|
122
|
+
"index_name": self.index_name,
|
123
|
+
"embedding": self.embedding,
|
124
|
+
"es_user": self.username or None,
|
125
|
+
"es_password": self.password or None,
|
126
|
+
}
|
127
|
+
|
128
|
+
if self.cloud_id:
|
129
|
+
es_params["es_cloud_id"] = self.cloud_id
|
130
|
+
else:
|
131
|
+
es_params["es_url"] = self.elasticsearch_url
|
132
|
+
|
133
|
+
if self.api_key:
|
134
|
+
es_params["api_key"] = self.api_key
|
135
|
+
|
136
|
+
# Check if we need to verify SSL certificates
|
137
|
+
if self.verify_certs is False:
|
138
|
+
# Build client parameters for Elasticsearch constructor
|
139
|
+
client_params: dict[str, Any] = {}
|
140
|
+
client_params["verify_certs"] = False
|
141
|
+
|
142
|
+
if self.cloud_id:
|
143
|
+
client_params["cloud_id"] = self.cloud_id
|
144
|
+
else:
|
145
|
+
client_params["hosts"] = [self.elasticsearch_url]
|
146
|
+
|
147
|
+
if self.api_key:
|
148
|
+
client_params["api_key"] = self.api_key
|
149
|
+
elif self.username and self.password:
|
150
|
+
client_params["basic_auth"] = (self.username, self.password)
|
151
|
+
|
152
|
+
es_client = Elasticsearch(**client_params)
|
153
|
+
es_params["es_connection"] = es_client
|
154
|
+
|
155
|
+
elasticsearch = ElasticsearchStore(**es_params)
|
156
|
+
|
157
|
+
# If documents are provided, add them to the store
|
158
|
+
if self.ingest_data:
|
159
|
+
documents = self._prepare_documents()
|
160
|
+
if documents:
|
161
|
+
elasticsearch.add_documents(documents)
|
162
|
+
|
163
|
+
return elasticsearch
|
164
|
+
|
165
|
+
def _prepare_documents(self) -> list[Document]:
|
166
|
+
"""Prepares documents from the input data to add to the vector store."""
|
167
|
+
self.ingest_data = self._prepare_ingest_data()
|
168
|
+
|
169
|
+
documents = []
|
170
|
+
for data in self.ingest_data:
|
171
|
+
if isinstance(data, Data):
|
172
|
+
documents.append(data.to_lc_document())
|
173
|
+
else:
|
174
|
+
error_message = "Vector Store Inputs must be Data objects."
|
175
|
+
self.log(error_message)
|
176
|
+
raise TypeError(error_message)
|
177
|
+
return documents
|
178
|
+
|
179
|
+
def _add_documents_to_vector_store(self, vector_store: "ElasticsearchStore") -> None:
|
180
|
+
"""Adds documents to the Vector Store."""
|
181
|
+
documents = self._prepare_documents()
|
182
|
+
if documents and self.embedding:
|
183
|
+
self.log(f"Adding {len(documents)} documents to the Vector Store.")
|
184
|
+
vector_store.add_documents(documents)
|
185
|
+
else:
|
186
|
+
self.log("No documents to add to the Vector Store.")
|
187
|
+
|
188
|
+
def search(self, query: str | None = None) -> list[dict[str, Any]]:
|
189
|
+
"""Search for similar documents in the vector store or retrieve all documents if no query is provided."""
|
190
|
+
vector_store = self.build_vector_store()
|
191
|
+
search_kwargs = {
|
192
|
+
"k": self.number_of_results,
|
193
|
+
"score_threshold": self.search_score_threshold,
|
194
|
+
}
|
195
|
+
|
196
|
+
if query:
|
197
|
+
search_type = self.search_type.lower()
|
198
|
+
if search_type not in {"similarity", "mmr"}:
|
199
|
+
msg = f"Invalid search type: {self.search_type}"
|
200
|
+
self.log(msg)
|
201
|
+
raise ValueError(msg)
|
202
|
+
try:
|
203
|
+
if search_type == "similarity":
|
204
|
+
results = vector_store.similarity_search_with_score(query, **search_kwargs)
|
205
|
+
elif search_type == "mmr":
|
206
|
+
results = vector_store.max_marginal_relevance_search(query, **search_kwargs)
|
207
|
+
except Exception as e:
|
208
|
+
msg = (
|
209
|
+
"Error occurred while querying the Elasticsearch VectorStore,"
|
210
|
+
" there is no Data into the VectorStore."
|
211
|
+
)
|
212
|
+
self.log(msg)
|
213
|
+
raise ValueError(msg) from e
|
214
|
+
return [
|
215
|
+
{"page_content": doc.page_content, "metadata": doc.metadata, "score": score} for doc, score in results
|
216
|
+
]
|
217
|
+
results = self.get_all_documents(vector_store, **search_kwargs)
|
218
|
+
return [{"page_content": doc.page_content, "metadata": doc.metadata, "score": score} for doc, score in results]
|
219
|
+
|
220
|
+
def get_all_documents(self, vector_store: ElasticsearchStore, **kwargs) -> list[tuple[Document, float]]:
|
221
|
+
"""Retrieve all documents from the vector store."""
|
222
|
+
client = vector_store.client
|
223
|
+
index_name = self.index_name
|
224
|
+
|
225
|
+
query = {
|
226
|
+
"query": {"match_all": {}},
|
227
|
+
"size": kwargs.get("k", self.number_of_results),
|
228
|
+
}
|
229
|
+
|
230
|
+
response = client.search(index=index_name, body=query)
|
231
|
+
|
232
|
+
results = []
|
233
|
+
for hit in response["hits"]["hits"]:
|
234
|
+
doc = Document(
|
235
|
+
page_content=hit["_source"].get("text", ""),
|
236
|
+
metadata=hit["_source"].get("metadata", {}),
|
237
|
+
)
|
238
|
+
score = hit["_score"]
|
239
|
+
results.append((doc, score))
|
240
|
+
|
241
|
+
return results
|
242
|
+
|
243
|
+
def search_documents(self) -> list[Data]:
|
244
|
+
"""Search for documents in the vector store based on the search input.
|
245
|
+
|
246
|
+
If no search input is provided, retrieve all documents.
|
247
|
+
"""
|
248
|
+
results = self.search(self.search_query)
|
249
|
+
retrieved_data = [
|
250
|
+
Data(
|
251
|
+
text=result["page_content"],
|
252
|
+
file_path=result["metadata"].get("file_path", ""),
|
253
|
+
)
|
254
|
+
for result in results
|
255
|
+
]
|
256
|
+
self.status = retrieved_data
|
257
|
+
return retrieved_data
|
258
|
+
|
259
|
+
def get_retriever_kwargs(self):
|
260
|
+
"""Get the keyword arguments for the retriever."""
|
261
|
+
return {
|
262
|
+
"search_type": self.search_type.lower(),
|
263
|
+
"search_kwargs": {
|
264
|
+
"k": self.number_of_results,
|
265
|
+
"score_threshold": self.search_score_threshold,
|
266
|
+
},
|
267
|
+
}
|