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,319 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
import orjson
|
4
|
+
from astrapy.admin import parse_api_endpoint
|
5
|
+
|
6
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
7
|
+
from lfx.helpers.data import docs_to_data
|
8
|
+
from lfx.inputs.inputs import (
|
9
|
+
BoolInput,
|
10
|
+
DictInput,
|
11
|
+
DropdownInput,
|
12
|
+
FloatInput,
|
13
|
+
HandleInput,
|
14
|
+
IntInput,
|
15
|
+
SecretStrInput,
|
16
|
+
StrInput,
|
17
|
+
)
|
18
|
+
from lfx.schema.data import Data
|
19
|
+
|
20
|
+
|
21
|
+
class AstraDBGraphVectorStoreComponent(LCVectorStoreComponent):
|
22
|
+
display_name: str = "Astra DB Graph"
|
23
|
+
description: str = "Implementation of Graph Vector Store using Astra DB"
|
24
|
+
name = "AstraDBGraph"
|
25
|
+
icon: str = "AstraDB"
|
26
|
+
|
27
|
+
inputs = [
|
28
|
+
SecretStrInput(
|
29
|
+
name="token",
|
30
|
+
display_name="Astra DB Application Token",
|
31
|
+
info="Authentication token for accessing Astra DB.",
|
32
|
+
value="ASTRA_DB_APPLICATION_TOKEN",
|
33
|
+
required=True,
|
34
|
+
advanced=os.getenv("ASTRA_ENHANCED", "false").lower() == "true",
|
35
|
+
),
|
36
|
+
SecretStrInput(
|
37
|
+
name="api_endpoint",
|
38
|
+
display_name="Database" if os.getenv("ASTRA_ENHANCED", "false").lower() == "true" else "API Endpoint",
|
39
|
+
info="API endpoint URL for the Astra DB service.",
|
40
|
+
value="ASTRA_DB_API_ENDPOINT",
|
41
|
+
required=True,
|
42
|
+
),
|
43
|
+
StrInput(
|
44
|
+
name="collection_name",
|
45
|
+
display_name="Collection Name",
|
46
|
+
info="The name of the collection within Astra DB where the vectors will be stored.",
|
47
|
+
required=True,
|
48
|
+
),
|
49
|
+
StrInput(
|
50
|
+
name="metadata_incoming_links_key",
|
51
|
+
display_name="Metadata incoming links key",
|
52
|
+
info="Metadata key used for incoming links.",
|
53
|
+
advanced=True,
|
54
|
+
),
|
55
|
+
*LCVectorStoreComponent.inputs,
|
56
|
+
StrInput(
|
57
|
+
name="keyspace",
|
58
|
+
display_name="Keyspace",
|
59
|
+
info="Optional keyspace within Astra DB to use for the collection.",
|
60
|
+
advanced=True,
|
61
|
+
),
|
62
|
+
HandleInput(
|
63
|
+
name="embedding_model",
|
64
|
+
display_name="Embedding Model",
|
65
|
+
input_types=["Embeddings"],
|
66
|
+
info="Allows an embedding model configuration.",
|
67
|
+
),
|
68
|
+
DropdownInput(
|
69
|
+
name="metric",
|
70
|
+
display_name="Metric",
|
71
|
+
info="Optional distance metric for vector comparisons in the vector store.",
|
72
|
+
options=["cosine", "dot_product", "euclidean"],
|
73
|
+
value="cosine",
|
74
|
+
advanced=True,
|
75
|
+
),
|
76
|
+
IntInput(
|
77
|
+
name="batch_size",
|
78
|
+
display_name="Batch Size",
|
79
|
+
info="Optional number of data to process in a single batch.",
|
80
|
+
advanced=True,
|
81
|
+
),
|
82
|
+
IntInput(
|
83
|
+
name="bulk_insert_batch_concurrency",
|
84
|
+
display_name="Bulk Insert Batch Concurrency",
|
85
|
+
info="Optional concurrency level for bulk insert operations.",
|
86
|
+
advanced=True,
|
87
|
+
),
|
88
|
+
IntInput(
|
89
|
+
name="bulk_insert_overwrite_concurrency",
|
90
|
+
display_name="Bulk Insert Overwrite Concurrency",
|
91
|
+
info="Optional concurrency level for bulk insert operations that overwrite existing data.",
|
92
|
+
advanced=True,
|
93
|
+
),
|
94
|
+
IntInput(
|
95
|
+
name="bulk_delete_concurrency",
|
96
|
+
display_name="Bulk Delete Concurrency",
|
97
|
+
info="Optional concurrency level for bulk delete operations.",
|
98
|
+
advanced=True,
|
99
|
+
),
|
100
|
+
DropdownInput(
|
101
|
+
name="setup_mode",
|
102
|
+
display_name="Setup Mode",
|
103
|
+
info="Configuration mode for setting up the vector store, with options like 'Sync', or 'Off'.",
|
104
|
+
options=["Sync", "Off"],
|
105
|
+
advanced=True,
|
106
|
+
value="Sync",
|
107
|
+
),
|
108
|
+
BoolInput(
|
109
|
+
name="pre_delete_collection",
|
110
|
+
display_name="Pre Delete Collection",
|
111
|
+
info="Boolean flag to determine whether to delete the collection before creating a new one.",
|
112
|
+
advanced=True,
|
113
|
+
value=False,
|
114
|
+
),
|
115
|
+
StrInput(
|
116
|
+
name="metadata_indexing_include",
|
117
|
+
display_name="Metadata Indexing Include",
|
118
|
+
info="Optional list of metadata fields to include in the indexing.",
|
119
|
+
advanced=True,
|
120
|
+
list=True,
|
121
|
+
),
|
122
|
+
StrInput(
|
123
|
+
name="metadata_indexing_exclude",
|
124
|
+
display_name="Metadata Indexing Exclude",
|
125
|
+
info="Optional list of metadata fields to exclude from the indexing.",
|
126
|
+
advanced=True,
|
127
|
+
list=True,
|
128
|
+
),
|
129
|
+
StrInput(
|
130
|
+
name="collection_indexing_policy",
|
131
|
+
display_name="Collection Indexing Policy",
|
132
|
+
info='Optional JSON string for the "indexing" field of the collection. '
|
133
|
+
"See https://docs.datastax.com/en/astra-db-serverless/api-reference/collections.html#the-indexing-option",
|
134
|
+
advanced=True,
|
135
|
+
),
|
136
|
+
IntInput(
|
137
|
+
name="number_of_results",
|
138
|
+
display_name="Number of Results",
|
139
|
+
info="Number of results to return.",
|
140
|
+
advanced=True,
|
141
|
+
value=4,
|
142
|
+
),
|
143
|
+
DropdownInput(
|
144
|
+
name="search_type",
|
145
|
+
display_name="Search Type",
|
146
|
+
info="Search type to use",
|
147
|
+
options=[
|
148
|
+
"Similarity",
|
149
|
+
"Similarity with score threshold",
|
150
|
+
"MMR (Max Marginal Relevance)",
|
151
|
+
"Graph Traversal",
|
152
|
+
"MMR (Max Marginal Relevance) Graph Traversal",
|
153
|
+
],
|
154
|
+
value="MMR (Max Marginal Relevance) Graph Traversal",
|
155
|
+
advanced=True,
|
156
|
+
),
|
157
|
+
FloatInput(
|
158
|
+
name="search_score_threshold",
|
159
|
+
display_name="Search Score Threshold",
|
160
|
+
info="Minimum similarity score threshold for search results. "
|
161
|
+
"(when using 'Similarity with score threshold')",
|
162
|
+
value=0,
|
163
|
+
advanced=True,
|
164
|
+
),
|
165
|
+
DictInput(
|
166
|
+
name="search_filter",
|
167
|
+
display_name="Search Metadata Filter",
|
168
|
+
info="Optional dictionary of filters to apply to the search query.",
|
169
|
+
advanced=True,
|
170
|
+
is_list=True,
|
171
|
+
),
|
172
|
+
]
|
173
|
+
|
174
|
+
@check_cached_vector_store
|
175
|
+
def build_vector_store(self):
|
176
|
+
try:
|
177
|
+
from langchain_astradb import AstraDBGraphVectorStore
|
178
|
+
from langchain_astradb.utils.astradb import SetupMode
|
179
|
+
except ImportError as e:
|
180
|
+
msg = (
|
181
|
+
"Could not import langchain Astra DB integration package. "
|
182
|
+
"Please install it with `pip install langchain-astradb`."
|
183
|
+
)
|
184
|
+
raise ImportError(msg) from e
|
185
|
+
|
186
|
+
try:
|
187
|
+
if not self.setup_mode:
|
188
|
+
self.setup_mode = self._inputs["setup_mode"].options[0]
|
189
|
+
|
190
|
+
setup_mode_value = SetupMode[self.setup_mode.upper()]
|
191
|
+
except KeyError as e:
|
192
|
+
msg = f"Invalid setup mode: {self.setup_mode}"
|
193
|
+
raise ValueError(msg) from e
|
194
|
+
|
195
|
+
try:
|
196
|
+
self.log(f"Initializing Graph Vector Store {self.collection_name}")
|
197
|
+
|
198
|
+
vector_store = AstraDBGraphVectorStore(
|
199
|
+
embedding=self.embedding_model,
|
200
|
+
collection_name=self.collection_name,
|
201
|
+
metadata_incoming_links_key=self.metadata_incoming_links_key or "incoming_links",
|
202
|
+
token=self.token,
|
203
|
+
api_endpoint=self.api_endpoint,
|
204
|
+
namespace=self.keyspace or None,
|
205
|
+
environment=parse_api_endpoint(self.api_endpoint).environment if self.api_endpoint else None,
|
206
|
+
metric=self.metric or None,
|
207
|
+
batch_size=self.batch_size or None,
|
208
|
+
bulk_insert_batch_concurrency=self.bulk_insert_batch_concurrency or None,
|
209
|
+
bulk_insert_overwrite_concurrency=self.bulk_insert_overwrite_concurrency or None,
|
210
|
+
bulk_delete_concurrency=self.bulk_delete_concurrency or None,
|
211
|
+
setup_mode=setup_mode_value,
|
212
|
+
pre_delete_collection=self.pre_delete_collection,
|
213
|
+
metadata_indexing_include=[s for s in self.metadata_indexing_include if s] or None,
|
214
|
+
metadata_indexing_exclude=[s for s in self.metadata_indexing_exclude if s] or None,
|
215
|
+
collection_indexing_policy=orjson.loads(self.collection_indexing_policy.encode("utf-8"))
|
216
|
+
if self.collection_indexing_policy
|
217
|
+
else None,
|
218
|
+
)
|
219
|
+
except Exception as e:
|
220
|
+
msg = f"Error initializing AstraDBGraphVectorStore: {e}"
|
221
|
+
raise ValueError(msg) from e
|
222
|
+
|
223
|
+
self.log(f"Vector Store initialized: {vector_store.astra_env.collection_name}")
|
224
|
+
self._add_documents_to_vector_store(vector_store)
|
225
|
+
|
226
|
+
return vector_store
|
227
|
+
|
228
|
+
def _add_documents_to_vector_store(self, vector_store) -> None:
|
229
|
+
self.ingest_data = self._prepare_ingest_data()
|
230
|
+
|
231
|
+
documents = []
|
232
|
+
for _input in self.ingest_data or []:
|
233
|
+
if isinstance(_input, Data):
|
234
|
+
documents.append(_input.to_lc_document())
|
235
|
+
else:
|
236
|
+
msg = "Vector Store Inputs must be Data objects."
|
237
|
+
raise TypeError(msg)
|
238
|
+
|
239
|
+
if documents:
|
240
|
+
self.log(f"Adding {len(documents)} documents to the Vector Store.")
|
241
|
+
try:
|
242
|
+
vector_store.add_documents(documents)
|
243
|
+
except Exception as e:
|
244
|
+
msg = f"Error adding documents to AstraDBGraphVectorStore: {e}"
|
245
|
+
raise ValueError(msg) from e
|
246
|
+
else:
|
247
|
+
self.log("No documents to add to the Vector Store.")
|
248
|
+
|
249
|
+
def _map_search_type(self) -> str:
|
250
|
+
match self.search_type:
|
251
|
+
case "Similarity":
|
252
|
+
return "similarity"
|
253
|
+
case "Similarity with score threshold":
|
254
|
+
return "similarity_score_threshold"
|
255
|
+
case "MMR (Max Marginal Relevance)":
|
256
|
+
return "mmr"
|
257
|
+
case "Graph Traversal":
|
258
|
+
return "traversal"
|
259
|
+
case "MMR (Max Marginal Relevance) Graph Traversal":
|
260
|
+
return "mmr_traversal"
|
261
|
+
case _:
|
262
|
+
return "similarity"
|
263
|
+
|
264
|
+
def _build_search_args(self):
|
265
|
+
args = {
|
266
|
+
"k": self.number_of_results,
|
267
|
+
"score_threshold": self.search_score_threshold,
|
268
|
+
}
|
269
|
+
|
270
|
+
if self.search_filter:
|
271
|
+
clean_filter = {k: v for k, v in self.search_filter.items() if k and v}
|
272
|
+
if len(clean_filter) > 0:
|
273
|
+
args["filter"] = clean_filter
|
274
|
+
return args
|
275
|
+
|
276
|
+
def search_documents(self, vector_store=None) -> list[Data]:
|
277
|
+
if not vector_store:
|
278
|
+
vector_store = self.build_vector_store()
|
279
|
+
|
280
|
+
self.log("Searching for documents in AstraDBGraphVectorStore.")
|
281
|
+
self.log(f"Search query: {self.search_query}")
|
282
|
+
self.log(f"Search type: {self.search_type}")
|
283
|
+
self.log(f"Number of results: {self.number_of_results}")
|
284
|
+
|
285
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
286
|
+
try:
|
287
|
+
search_type = self._map_search_type()
|
288
|
+
search_args = self._build_search_args()
|
289
|
+
|
290
|
+
docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)
|
291
|
+
|
292
|
+
# Drop links from the metadata. At this point the links don't add any value for building the
|
293
|
+
# context and haven't been restored to json which causes the conversion to fail.
|
294
|
+
self.log("Removing links from metadata.")
|
295
|
+
for doc in docs:
|
296
|
+
if "links" in doc.metadata:
|
297
|
+
doc.metadata.pop("links")
|
298
|
+
|
299
|
+
except Exception as e:
|
300
|
+
msg = f"Error performing search in AstraDBGraphVectorStore: {e}"
|
301
|
+
raise ValueError(msg) from e
|
302
|
+
|
303
|
+
self.log(f"Retrieved documents: {len(docs)}")
|
304
|
+
|
305
|
+
data = docs_to_data(docs)
|
306
|
+
|
307
|
+
self.log(f"Converted documents to data: {len(data)}")
|
308
|
+
|
309
|
+
self.status = data
|
310
|
+
return data
|
311
|
+
self.log("No search input provided. Skipping search.")
|
312
|
+
return []
|
313
|
+
|
314
|
+
def get_retriever_kwargs(self):
|
315
|
+
search_args = self._build_search_args()
|
316
|
+
return {
|
317
|
+
"search_type": self._map_search_type(),
|
318
|
+
"search_kwargs": search_args,
|
319
|
+
}
|
@@ -0,0 +1,264 @@
|
|
1
|
+
from langchain_community.vectorstores import Cassandra
|
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.inputs.inputs import BoolInput, DictInput, FloatInput
|
6
|
+
from lfx.io import (
|
7
|
+
DropdownInput,
|
8
|
+
HandleInput,
|
9
|
+
IntInput,
|
10
|
+
MessageTextInput,
|
11
|
+
SecretStrInput,
|
12
|
+
)
|
13
|
+
from lfx.schema.data import Data
|
14
|
+
|
15
|
+
|
16
|
+
class CassandraVectorStoreComponent(LCVectorStoreComponent):
|
17
|
+
display_name = "Cassandra"
|
18
|
+
description = "Cassandra Vector Store with search capabilities"
|
19
|
+
documentation = "https://python.langchain.com/docs/modules/data_connection/vectorstores/integrations/cassandra"
|
20
|
+
name = "Cassandra"
|
21
|
+
icon = "Cassandra"
|
22
|
+
|
23
|
+
inputs = [
|
24
|
+
MessageTextInput(
|
25
|
+
name="database_ref",
|
26
|
+
display_name="Contact Points / Astra Database ID",
|
27
|
+
info="Contact points for the database (or Astra DB database ID)",
|
28
|
+
required=True,
|
29
|
+
),
|
30
|
+
MessageTextInput(
|
31
|
+
name="username", display_name="Username", info="Username for the database (leave empty for Astra DB)."
|
32
|
+
),
|
33
|
+
SecretStrInput(
|
34
|
+
name="token",
|
35
|
+
display_name="Password / Astra DB Token",
|
36
|
+
info="User password for the database (or Astra DB token).",
|
37
|
+
required=True,
|
38
|
+
),
|
39
|
+
MessageTextInput(
|
40
|
+
name="keyspace",
|
41
|
+
display_name="Keyspace",
|
42
|
+
info="Table Keyspace (or Astra DB namespace).",
|
43
|
+
required=True,
|
44
|
+
),
|
45
|
+
MessageTextInput(
|
46
|
+
name="table_name",
|
47
|
+
display_name="Table Name",
|
48
|
+
info="The name of the table (or Astra DB collection) where vectors will be stored.",
|
49
|
+
required=True,
|
50
|
+
),
|
51
|
+
IntInput(
|
52
|
+
name="ttl_seconds",
|
53
|
+
display_name="TTL Seconds",
|
54
|
+
info="Optional time-to-live for the added texts.",
|
55
|
+
advanced=True,
|
56
|
+
),
|
57
|
+
IntInput(
|
58
|
+
name="batch_size",
|
59
|
+
display_name="Batch Size",
|
60
|
+
info="Optional number of data to process in a single batch.",
|
61
|
+
value=16,
|
62
|
+
advanced=True,
|
63
|
+
),
|
64
|
+
DropdownInput(
|
65
|
+
name="setup_mode",
|
66
|
+
display_name="Setup Mode",
|
67
|
+
info="Configuration mode for setting up the Cassandra table, with options like 'Sync', 'Async', or 'Off'.",
|
68
|
+
options=["Sync", "Async", "Off"],
|
69
|
+
value="Sync",
|
70
|
+
advanced=True,
|
71
|
+
),
|
72
|
+
DictInput(
|
73
|
+
name="cluster_kwargs",
|
74
|
+
display_name="Cluster arguments",
|
75
|
+
info="Optional dictionary of additional keyword arguments for the Cassandra cluster.",
|
76
|
+
advanced=True,
|
77
|
+
list=True,
|
78
|
+
),
|
79
|
+
*LCVectorStoreComponent.inputs,
|
80
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
81
|
+
IntInput(
|
82
|
+
name="number_of_results",
|
83
|
+
display_name="Number of Results",
|
84
|
+
info="Number of results to return.",
|
85
|
+
value=4,
|
86
|
+
advanced=True,
|
87
|
+
),
|
88
|
+
DropdownInput(
|
89
|
+
name="search_type",
|
90
|
+
display_name="Search Type",
|
91
|
+
info="Search type to use",
|
92
|
+
options=["Similarity", "Similarity with score threshold", "MMR (Max Marginal Relevance)"],
|
93
|
+
value="Similarity",
|
94
|
+
advanced=True,
|
95
|
+
),
|
96
|
+
FloatInput(
|
97
|
+
name="search_score_threshold",
|
98
|
+
display_name="Search Score Threshold",
|
99
|
+
info="Minimum similarity score threshold for search results. "
|
100
|
+
"(when using 'Similarity with score threshold')",
|
101
|
+
value=0,
|
102
|
+
advanced=True,
|
103
|
+
),
|
104
|
+
DictInput(
|
105
|
+
name="search_filter",
|
106
|
+
display_name="Search Metadata Filter",
|
107
|
+
info="Optional dictionary of filters to apply to the search query.",
|
108
|
+
advanced=True,
|
109
|
+
list=True,
|
110
|
+
),
|
111
|
+
MessageTextInput(
|
112
|
+
name="body_search",
|
113
|
+
display_name="Search Body",
|
114
|
+
info="Document textual search terms to apply to the search query.",
|
115
|
+
advanced=True,
|
116
|
+
),
|
117
|
+
BoolInput(
|
118
|
+
name="enable_body_search",
|
119
|
+
display_name="Enable Body Search",
|
120
|
+
info="Flag to enable body search. This must be enabled BEFORE the table is created.",
|
121
|
+
value=False,
|
122
|
+
advanced=True,
|
123
|
+
),
|
124
|
+
]
|
125
|
+
|
126
|
+
@check_cached_vector_store
|
127
|
+
def build_vector_store(self) -> Cassandra:
|
128
|
+
try:
|
129
|
+
import cassio
|
130
|
+
from langchain_community.utilities.cassandra import SetupMode
|
131
|
+
except ImportError as e:
|
132
|
+
msg = "Could not import cassio integration package. Please install it with `pip install cassio`."
|
133
|
+
raise ImportError(msg) from e
|
134
|
+
|
135
|
+
from uuid import UUID
|
136
|
+
|
137
|
+
database_ref = self.database_ref
|
138
|
+
|
139
|
+
try:
|
140
|
+
UUID(self.database_ref)
|
141
|
+
is_astra = True
|
142
|
+
except ValueError:
|
143
|
+
is_astra = False
|
144
|
+
if "," in self.database_ref:
|
145
|
+
# use a copy because we can't change the type of the parameter
|
146
|
+
database_ref = self.database_ref.split(",")
|
147
|
+
|
148
|
+
if is_astra:
|
149
|
+
cassio.init(
|
150
|
+
database_id=database_ref,
|
151
|
+
token=self.token,
|
152
|
+
cluster_kwargs=self.cluster_kwargs,
|
153
|
+
)
|
154
|
+
else:
|
155
|
+
cassio.init(
|
156
|
+
contact_points=database_ref,
|
157
|
+
username=self.username,
|
158
|
+
password=self.token,
|
159
|
+
cluster_kwargs=self.cluster_kwargs,
|
160
|
+
)
|
161
|
+
|
162
|
+
# Convert DataFrame to Data if needed using parent's method
|
163
|
+
self.ingest_data = self._prepare_ingest_data()
|
164
|
+
|
165
|
+
documents = []
|
166
|
+
for _input in self.ingest_data or []:
|
167
|
+
if isinstance(_input, Data):
|
168
|
+
documents.append(_input.to_lc_document())
|
169
|
+
else:
|
170
|
+
documents.append(_input)
|
171
|
+
|
172
|
+
body_index_options = [("index_analyzer", "STANDARD")] if self.enable_body_search else None
|
173
|
+
|
174
|
+
if self.setup_mode == "Off":
|
175
|
+
setup_mode = SetupMode.OFF
|
176
|
+
elif self.setup_mode == "Sync":
|
177
|
+
setup_mode = SetupMode.SYNC
|
178
|
+
else:
|
179
|
+
setup_mode = SetupMode.ASYNC
|
180
|
+
|
181
|
+
if documents:
|
182
|
+
self.log(f"Adding {len(documents)} documents to the Vector Store.")
|
183
|
+
table = Cassandra.from_documents(
|
184
|
+
documents=documents,
|
185
|
+
embedding=self.embedding,
|
186
|
+
table_name=self.table_name,
|
187
|
+
keyspace=self.keyspace,
|
188
|
+
ttl_seconds=self.ttl_seconds or None,
|
189
|
+
batch_size=self.batch_size,
|
190
|
+
body_index_options=body_index_options,
|
191
|
+
)
|
192
|
+
else:
|
193
|
+
self.log("No documents to add to the Vector Store.")
|
194
|
+
table = Cassandra(
|
195
|
+
embedding=self.embedding,
|
196
|
+
table_name=self.table_name,
|
197
|
+
keyspace=self.keyspace,
|
198
|
+
ttl_seconds=self.ttl_seconds or None,
|
199
|
+
body_index_options=body_index_options,
|
200
|
+
setup_mode=setup_mode,
|
201
|
+
)
|
202
|
+
return table
|
203
|
+
|
204
|
+
def _map_search_type(self) -> str:
|
205
|
+
if self.search_type == "Similarity with score threshold":
|
206
|
+
return "similarity_score_threshold"
|
207
|
+
if self.search_type == "MMR (Max Marginal Relevance)":
|
208
|
+
return "mmr"
|
209
|
+
return "similarity"
|
210
|
+
|
211
|
+
def search_documents(self) -> list[Data]:
|
212
|
+
vector_store = self.build_vector_store()
|
213
|
+
|
214
|
+
self.log(f"Search input: {self.search_query}")
|
215
|
+
self.log(f"Search type: {self.search_type}")
|
216
|
+
self.log(f"Number of results: {self.number_of_results}")
|
217
|
+
|
218
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
219
|
+
try:
|
220
|
+
search_type = self._map_search_type()
|
221
|
+
search_args = self._build_search_args()
|
222
|
+
|
223
|
+
self.log(f"Search args: {search_args}")
|
224
|
+
|
225
|
+
docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)
|
226
|
+
except KeyError as e:
|
227
|
+
if "content" in str(e):
|
228
|
+
msg = (
|
229
|
+
"You should ingest data through Langflow (or LangChain) to query it in Langflow. "
|
230
|
+
"Your collection does not contain a field name 'content'."
|
231
|
+
)
|
232
|
+
raise ValueError(msg) from e
|
233
|
+
raise
|
234
|
+
|
235
|
+
self.log(f"Retrieved documents: {len(docs)}")
|
236
|
+
|
237
|
+
data = docs_to_data(docs)
|
238
|
+
self.status = data
|
239
|
+
return data
|
240
|
+
return []
|
241
|
+
|
242
|
+
def _build_search_args(self):
|
243
|
+
args = {
|
244
|
+
"k": self.number_of_results,
|
245
|
+
"score_threshold": self.search_score_threshold,
|
246
|
+
}
|
247
|
+
|
248
|
+
if self.search_filter:
|
249
|
+
clean_filter = {k: v for k, v in self.search_filter.items() if k and v}
|
250
|
+
if len(clean_filter) > 0:
|
251
|
+
args["filter"] = clean_filter
|
252
|
+
if self.body_search:
|
253
|
+
if not self.enable_body_search:
|
254
|
+
msg = "You should enable body search when creating the table to search the body field."
|
255
|
+
raise ValueError(msg)
|
256
|
+
args["body_search"] = self.body_search
|
257
|
+
return args
|
258
|
+
|
259
|
+
def get_retriever_kwargs(self):
|
260
|
+
search_args = self._build_search_args()
|
261
|
+
return {
|
262
|
+
"search_type": self._map_search_type(),
|
263
|
+
"search_kwargs": search_args,
|
264
|
+
}
|