lfx-nightly 0.2.0.dev25__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.
Potentially problematic release.
This version of lfx-nightly might be problematic. Click here for more details.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/_assets/component_index.json +1 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +375 -0
- lfx/base/agents/altk_base_agent.py +380 -0
- lfx/base/agents/altk_tool_wrappers.py +565 -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 +430 -0
- lfx/base/agents/utils.py +237 -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 +2584 -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 +810 -0
- lfx/base/data/docling_utils.py +338 -0
- lfx/base/data/storage_utils.py +192 -0
- lfx/base/data/utils.py +362 -0
- lfx/base/datastax/__init__.py +5 -0
- lfx/base/datastax/astradb_base.py +896 -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/embeddings_class.py +113 -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 +21 -0
- lfx/base/io/text.py +22 -0
- lfx/base/knowledge_bases/__init__.py +3 -0
- lfx/base/knowledge_bases/knowledge_base_utils.py +137 -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 +1659 -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 +51 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/cometapi_constants.py +54 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/google_generative_ai_model.py +38 -0
- lfx/base/models/groq_constants.py +150 -0
- lfx/base/models/groq_model_discovery.py +265 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +378 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +108 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +52 -0
- lfx/base/models/openai_constants.py +129 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/models/watsonx_constants.py +36 -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 +698 -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 +327 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +506 -0
- lfx/cli/script_loader.py +289 -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 +428 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +115 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/altk/__init__.py +34 -0
- lfx/components/altk/altk_agent.py +193 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_converse.py +195 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +130 -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 +169 -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 +169 -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/cometapi/__init__.py +32 -0
- lfx/components/cometapi/cometapi.py +166 -0
- lfx/components/composio/__init__.py +222 -0
- lfx/components/composio/agentql_composio.py +11 -0
- lfx/components/composio/agiled_composio.py +11 -0
- lfx/components/composio/airtable_composio.py +11 -0
- lfx/components/composio/apollo_composio.py +11 -0
- lfx/components/composio/asana_composio.py +11 -0
- lfx/components/composio/attio_composio.py +11 -0
- lfx/components/composio/bitbucket_composio.py +11 -0
- lfx/components/composio/bolna_composio.py +11 -0
- lfx/components/composio/brightdata_composio.py +11 -0
- lfx/components/composio/calendly_composio.py +11 -0
- lfx/components/composio/canva_composio.py +11 -0
- lfx/components/composio/canvas_composio.py +11 -0
- lfx/components/composio/coda_composio.py +11 -0
- lfx/components/composio/composio_api.py +278 -0
- lfx/components/composio/contentful_composio.py +11 -0
- lfx/components/composio/digicert_composio.py +11 -0
- lfx/components/composio/discord_composio.py +11 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/elevenlabs_composio.py +11 -0
- lfx/components/composio/exa_composio.py +11 -0
- lfx/components/composio/figma_composio.py +11 -0
- lfx/components/composio/finage_composio.py +11 -0
- lfx/components/composio/firecrawl_composio.py +11 -0
- lfx/components/composio/fireflies_composio.py +11 -0
- lfx/components/composio/fixer_composio.py +11 -0
- lfx/components/composio/flexisign_composio.py +11 -0
- lfx/components/composio/freshdesk_composio.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlebigquery_composio.py +11 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googleclassroom_composio.py +11 -0
- lfx/components/composio/googledocs_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googlesheets_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/heygen_composio.py +11 -0
- lfx/components/composio/instagram_composio.py +11 -0
- lfx/components/composio/jira_composio.py +11 -0
- lfx/components/composio/jotform_composio.py +11 -0
- lfx/components/composio/klaviyo_composio.py +11 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/listennotes_composio.py +11 -0
- lfx/components/composio/mem0_composio.py +11 -0
- lfx/components/composio/miro_composio.py +11 -0
- lfx/components/composio/missive_composio.py +11 -0
- lfx/components/composio/notion_composio.py +11 -0
- lfx/components/composio/onedrive_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/pandadoc_composio.py +11 -0
- lfx/components/composio/peopledatalabs_composio.py +11 -0
- lfx/components/composio/perplexityai_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/serpapi_composio.py +11 -0
- lfx/components/composio/slack_composio.py +11 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/snowflake_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/tavily_composio.py +11 -0
- lfx/components/composio/timelinesai_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/wrike_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 +108 -0
- lfx/components/crewai/hierarchical_crew.py +47 -0
- lfx/components/crewai/hierarchical_task.py +45 -0
- lfx/components/crewai/sequential_crew.py +53 -0
- lfx/components/crewai/sequential_task.py +74 -0
- lfx/components/crewai/sequential_task_agent.py +144 -0
- lfx/components/cuga/__init__.py +34 -0
- lfx/components/cuga/cuga_agent.py +730 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +114 -0
- lfx/components/data_source/__init__.py +58 -0
- lfx/components/data_source/api_request.py +577 -0
- lfx/components/data_source/csv_to_data.py +101 -0
- lfx/components/data_source/json_to_data.py +106 -0
- lfx/components/data_source/mock_data.py +398 -0
- lfx/components/data_source/news_search.py +166 -0
- lfx/components/data_source/rss.py +71 -0
- lfx/components/data_source/sql_executor.py +101 -0
- lfx/components/data_source/url.py +311 -0
- lfx/components/data_source/web_search.py +326 -0
- lfx/components/datastax/__init__.py +76 -0
- lfx/components/datastax/astradb_assistant_manager.py +307 -0
- lfx/components/datastax/astradb_chatmemory.py +40 -0
- lfx/components/datastax/astradb_cql.py +288 -0
- lfx/components/datastax/astradb_graph.py +217 -0
- lfx/components/datastax/astradb_tool.py +378 -0
- lfx/components/datastax/astradb_vectorize.py +122 -0
- lfx/components/datastax/astradb_vectorstore.py +449 -0
- lfx/components/datastax/create_assistant.py +59 -0
- lfx/components/datastax/create_thread.py +33 -0
- lfx/components/datastax/dotenv.py +36 -0
- lfx/components/datastax/get_assistant.py +38 -0
- lfx/components/datastax/getenvvar.py +31 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +315 -0
- lfx/components/datastax/list_assistants.py +26 -0
- lfx/components/datastax/run.py +90 -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 +238 -0
- lfx/components/docling/docling_remote.py +195 -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 +789 -0
- lfx/components/elastic/opensearch_multimodal.py +1575 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +77 -0
- lfx/components/embeddings/text_embedder.py +65 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/files_and_knowledge/__init__.py +47 -0
- lfx/components/files_and_knowledge/directory.py +113 -0
- lfx/components/files_and_knowledge/file.py +841 -0
- lfx/components/files_and_knowledge/ingestion.py +694 -0
- lfx/components/files_and_knowledge/retrieval.py +264 -0
- lfx/components/files_and_knowledge/save_file.py +746 -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/flow_controls/__init__.py +58 -0
- lfx/components/flow_controls/conditional_router.py +208 -0
- lfx/components/flow_controls/data_conditional_router.py +126 -0
- lfx/components/flow_controls/flow_tool.py +111 -0
- lfx/components/flow_controls/listen.py +29 -0
- lfx/components/flow_controls/loop.py +163 -0
- lfx/components/flow_controls/notify.py +88 -0
- lfx/components/flow_controls/pass_message.py +36 -0
- lfx/components/flow_controls/run_flow.py +108 -0
- lfx/components/flow_controls/sub_flow.py +115 -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 +193 -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 +144 -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 +143 -0
- lfx/components/helpers/__init__.py +154 -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 +199 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +207 -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 +40 -0
- lfx/components/input_output/chat.py +109 -0
- lfx/components/input_output/chat_output.py +184 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/input_output/webhook.py +56 -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/knowledge_bases/__init__.py +89 -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 +175 -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 +100 -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/llm_operations/__init__.py +46 -0
- lfx/components/llm_operations/batch_run.py +205 -0
- lfx/components/llm_operations/lambda_filter.py +218 -0
- lfx/components/llm_operations/llm_conditional_router.py +421 -0
- lfx/components/llm_operations/llm_selector.py +499 -0
- lfx/components/llm_operations/structured_output.py +244 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +133 -0
- lfx/components/logic/__init__.py +181 -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 +147 -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 +89 -0
- lfx/components/models_and_agents/__init__.py +49 -0
- lfx/components/models_and_agents/agent.py +644 -0
- lfx/components/models_and_agents/embedding_model.py +423 -0
- lfx/components/models_and_agents/language_model.py +398 -0
- lfx/components/models_and_agents/mcp_component.py +594 -0
- lfx/components/models_and_agents/memory.py +268 -0
- lfx/components/models_and_agents/prompt.py +67 -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 +151 -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 +548 -0
- lfx/components/ollama/ollama_embeddings.py +103 -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 +104 -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 +72 -0
- lfx/components/processing/alter_metadata.py +109 -0
- lfx/components/processing/combine_text.py +40 -0
- lfx/components/processing/converter.py +248 -0
- lfx/components/processing/create_data.py +111 -0
- lfx/components/processing/create_list.py +40 -0
- lfx/components/processing/data_operations.py +528 -0
- lfx/components/processing/data_to_dataframe.py +71 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/dataframe_to_toolset.py +259 -0
- lfx/components/processing/dynamic_create_data.py +357 -0
- lfx/components/processing/extract_key.py +54 -0
- lfx/components/processing/filter_data.py +43 -0
- lfx/components/processing/filter_data_values.py +89 -0
- lfx/components/processing/json_cleaner.py +104 -0
- lfx/components/processing/merge_data.py +91 -0
- lfx/components/processing/message_to_data.py +37 -0
- lfx/components/processing/output_parser.py +46 -0
- lfx/components/processing/parse_data.py +71 -0
- lfx/components/processing/parse_dataframe.py +69 -0
- lfx/components/processing/parse_json_data.py +91 -0
- lfx/components/processing/parser.py +148 -0
- lfx/components/processing/regex.py +83 -0
- lfx/components/processing/select_data.py +49 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/store_message.py +91 -0
- lfx/components/processing/update_data.py +161 -0
- lfx/components/prototypes/__init__.py +35 -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 +66 -0
- lfx/components/tools/calculator.py +109 -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 +328 -0
- lfx/components/tools/python_repl.py +98 -0
- lfx/components/tools/search_api.py +88 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +120 -0
- lfx/components/tools/tavily_search_tool.py +345 -0
- lfx/components/tools/wikidata_api.py +103 -0
- lfx/components/tools/wikipedia_api.py +50 -0
- lfx/components/tools/yahoo_finance.py +130 -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 +301 -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 +191 -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/utilities/__init__.py +43 -0
- lfx/components/utilities/calculator_core.py +89 -0
- lfx/components/utilities/current_date.py +42 -0
- lfx/components/utilities/id_generator.py +42 -0
- lfx/components/utilities/python_repl_core.py +98 -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 +34 -0
- lfx/components/vectorstores/local_db.py +270 -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/vlmrun/__init__.py +34 -0
- lfx/components/vlmrun/vlmrun_transcription.py +224 -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 +206 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +45 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +87 -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 +1890 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +650 -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 +523 -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 +216 -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 +300 -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 +2298 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +53 -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 +250 -0
- lfx/graph/utils.py +206 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +826 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +316 -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 +141 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +308 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +352 -0
- lfx/inputs/inputs.py +718 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +897 -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 +317 -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 +295 -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 +411 -0
- lfx/logging/__init__.py +11 -0
- lfx/logging/logger.py +24 -0
- lfx/memory/__init__.py +70 -0
- lfx/memory/stubs.py +302 -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/cross_module.py +80 -0
- lfx/schema/data.py +309 -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 +184 -0
- lfx/schema/json_schema.py +186 -0
- lfx/schema/log.py +62 -0
- lfx/schema/message.py +493 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +180 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +142 -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 +26 -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/database/__init__.py +5 -0
- lfx/services/database/service.py +25 -0
- lfx/services/deps.py +194 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +185 -0
- lfx/services/mcp_composer/__init__.py +6 -0
- lfx/services/mcp_composer/factory.py +16 -0
- lfx/services/mcp_composer/service.py +1441 -0
- lfx/services/schema.py +21 -0
- lfx/services/session.py +87 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +133 -0
- lfx/services/settings/base.py +668 -0
- lfx/services/settings/constants.py +43 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +11 -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 +185 -0
- lfx/services/storage/service.py +177 -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 +260 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +214 -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 +233 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +34 -0
- lfx/utils/image.py +79 -0
- lfx/utils/langflow_utils.py +52 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/ssrf_protection.py +384 -0
- lfx/utils/util.py +626 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/validate_cloud.py +26 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
- lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
- lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
- lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import orjson
|
|
2
|
+
|
|
3
|
+
from lfx.base.datastax.astradb_base import AstraDBBaseComponent
|
|
4
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
|
5
|
+
from lfx.helpers.data import docs_to_data
|
|
6
|
+
from lfx.inputs.inputs import (
|
|
7
|
+
DictInput,
|
|
8
|
+
DropdownInput,
|
|
9
|
+
FloatInput,
|
|
10
|
+
IntInput,
|
|
11
|
+
StrInput,
|
|
12
|
+
)
|
|
13
|
+
from lfx.schema.data import Data
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class AstraDBGraphVectorStoreComponent(AstraDBBaseComponent, LCVectorStoreComponent):
|
|
17
|
+
display_name: str = "Astra DB Graph"
|
|
18
|
+
description: str = "Implementation of Graph Vector Store using Astra DB"
|
|
19
|
+
name = "AstraDBGraph"
|
|
20
|
+
documentation: str = "https://docs.langflow.org/bundles-datastax"
|
|
21
|
+
icon: str = "AstraDB"
|
|
22
|
+
legacy: bool = True
|
|
23
|
+
replacement = ["datastax.GraphRAG"]
|
|
24
|
+
|
|
25
|
+
inputs = [
|
|
26
|
+
*AstraDBBaseComponent.inputs,
|
|
27
|
+
*LCVectorStoreComponent.inputs,
|
|
28
|
+
StrInput(
|
|
29
|
+
name="metadata_incoming_links_key",
|
|
30
|
+
display_name="Metadata incoming links key",
|
|
31
|
+
info="Metadata key used for incoming links.",
|
|
32
|
+
advanced=True,
|
|
33
|
+
),
|
|
34
|
+
IntInput(
|
|
35
|
+
name="number_of_results",
|
|
36
|
+
display_name="Number of Results",
|
|
37
|
+
info="Number of results to return.",
|
|
38
|
+
advanced=True,
|
|
39
|
+
value=4,
|
|
40
|
+
),
|
|
41
|
+
DropdownInput(
|
|
42
|
+
name="search_type",
|
|
43
|
+
display_name="Search Type",
|
|
44
|
+
info="Search type to use",
|
|
45
|
+
options=[
|
|
46
|
+
"Similarity",
|
|
47
|
+
"Similarity with score threshold",
|
|
48
|
+
"MMR (Max Marginal Relevance)",
|
|
49
|
+
"Graph Traversal",
|
|
50
|
+
"MMR (Max Marginal Relevance) Graph Traversal",
|
|
51
|
+
],
|
|
52
|
+
value="MMR (Max Marginal Relevance) Graph Traversal",
|
|
53
|
+
advanced=True,
|
|
54
|
+
),
|
|
55
|
+
FloatInput(
|
|
56
|
+
name="search_score_threshold",
|
|
57
|
+
display_name="Search Score Threshold",
|
|
58
|
+
info="Minimum similarity score threshold for search results. "
|
|
59
|
+
"(when using 'Similarity with score threshold')",
|
|
60
|
+
value=0,
|
|
61
|
+
advanced=True,
|
|
62
|
+
),
|
|
63
|
+
DictInput(
|
|
64
|
+
name="search_filter",
|
|
65
|
+
display_name="Search Metadata Filter",
|
|
66
|
+
info="Optional dictionary of filters to apply to the search query.",
|
|
67
|
+
advanced=True,
|
|
68
|
+
is_list=True,
|
|
69
|
+
),
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
@check_cached_vector_store
|
|
73
|
+
def build_vector_store(self):
|
|
74
|
+
try:
|
|
75
|
+
from langchain_astradb import AstraDBGraphVectorStore
|
|
76
|
+
from langchain_astradb.utils.astradb import SetupMode
|
|
77
|
+
except ImportError as e:
|
|
78
|
+
msg = (
|
|
79
|
+
"Could not import langchain Astra DB integration package. "
|
|
80
|
+
"Please install it with `pip install langchain-astradb`."
|
|
81
|
+
)
|
|
82
|
+
raise ImportError(msg) from e
|
|
83
|
+
|
|
84
|
+
try:
|
|
85
|
+
if not self.setup_mode:
|
|
86
|
+
self.setup_mode = self._inputs["setup_mode"].options[0]
|
|
87
|
+
|
|
88
|
+
setup_mode_value = SetupMode[self.setup_mode.upper()]
|
|
89
|
+
except KeyError as e:
|
|
90
|
+
msg = f"Invalid setup mode: {self.setup_mode}"
|
|
91
|
+
raise ValueError(msg) from e
|
|
92
|
+
|
|
93
|
+
try:
|
|
94
|
+
self.log(f"Initializing Graph Vector Store {self.collection_name}")
|
|
95
|
+
|
|
96
|
+
vector_store = AstraDBGraphVectorStore(
|
|
97
|
+
embedding=self.embedding_model,
|
|
98
|
+
collection_name=self.collection_name,
|
|
99
|
+
metadata_incoming_links_key=self.metadata_incoming_links_key or "incoming_links",
|
|
100
|
+
token=self.token,
|
|
101
|
+
api_endpoint=self.get_api_endpoint(),
|
|
102
|
+
namespace=self.get_keyspace(),
|
|
103
|
+
environment=self.environment,
|
|
104
|
+
metric=self.metric or None,
|
|
105
|
+
batch_size=self.batch_size or None,
|
|
106
|
+
bulk_insert_batch_concurrency=self.bulk_insert_batch_concurrency or None,
|
|
107
|
+
bulk_insert_overwrite_concurrency=self.bulk_insert_overwrite_concurrency or None,
|
|
108
|
+
bulk_delete_concurrency=self.bulk_delete_concurrency or None,
|
|
109
|
+
setup_mode=setup_mode_value,
|
|
110
|
+
pre_delete_collection=self.pre_delete_collection,
|
|
111
|
+
metadata_indexing_include=[s for s in self.metadata_indexing_include if s] or None,
|
|
112
|
+
metadata_indexing_exclude=[s for s in self.metadata_indexing_exclude if s] or None,
|
|
113
|
+
collection_indexing_policy=orjson.loads(self.collection_indexing_policy.encode("utf-8"))
|
|
114
|
+
if self.collection_indexing_policy
|
|
115
|
+
else None,
|
|
116
|
+
)
|
|
117
|
+
except Exception as e:
|
|
118
|
+
msg = f"Error initializing AstraDBGraphVectorStore: {e}"
|
|
119
|
+
raise ValueError(msg) from e
|
|
120
|
+
|
|
121
|
+
self.log(f"Vector Store initialized: {vector_store.astra_env.collection_name}")
|
|
122
|
+
self._add_documents_to_vector_store(vector_store)
|
|
123
|
+
|
|
124
|
+
return vector_store
|
|
125
|
+
|
|
126
|
+
def _add_documents_to_vector_store(self, vector_store) -> None:
|
|
127
|
+
self.ingest_data = self._prepare_ingest_data()
|
|
128
|
+
|
|
129
|
+
documents = []
|
|
130
|
+
for _input in self.ingest_data or []:
|
|
131
|
+
if isinstance(_input, Data):
|
|
132
|
+
documents.append(_input.to_lc_document())
|
|
133
|
+
else:
|
|
134
|
+
msg = "Vector Store Inputs must be Data objects."
|
|
135
|
+
raise TypeError(msg)
|
|
136
|
+
|
|
137
|
+
if documents:
|
|
138
|
+
self.log(f"Adding {len(documents)} documents to the Vector Store.")
|
|
139
|
+
try:
|
|
140
|
+
vector_store.add_documents(documents)
|
|
141
|
+
except Exception as e:
|
|
142
|
+
msg = f"Error adding documents to AstraDBGraphVectorStore: {e}"
|
|
143
|
+
raise ValueError(msg) from e
|
|
144
|
+
else:
|
|
145
|
+
self.log("No documents to add to the Vector Store.")
|
|
146
|
+
|
|
147
|
+
def _map_search_type(self) -> str:
|
|
148
|
+
match self.search_type:
|
|
149
|
+
case "Similarity":
|
|
150
|
+
return "similarity"
|
|
151
|
+
case "Similarity with score threshold":
|
|
152
|
+
return "similarity_score_threshold"
|
|
153
|
+
case "MMR (Max Marginal Relevance)":
|
|
154
|
+
return "mmr"
|
|
155
|
+
case "Graph Traversal":
|
|
156
|
+
return "traversal"
|
|
157
|
+
case "MMR (Max Marginal Relevance) Graph Traversal":
|
|
158
|
+
return "mmr_traversal"
|
|
159
|
+
case _:
|
|
160
|
+
return "similarity"
|
|
161
|
+
|
|
162
|
+
def _build_search_args(self):
|
|
163
|
+
args = {
|
|
164
|
+
"k": self.number_of_results,
|
|
165
|
+
"score_threshold": self.search_score_threshold,
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if self.search_filter:
|
|
169
|
+
clean_filter = {k: v for k, v in self.search_filter.items() if k and v}
|
|
170
|
+
if len(clean_filter) > 0:
|
|
171
|
+
args["filter"] = clean_filter
|
|
172
|
+
return args
|
|
173
|
+
|
|
174
|
+
def search_documents(self, vector_store=None) -> list[Data]:
|
|
175
|
+
if not vector_store:
|
|
176
|
+
vector_store = self.build_vector_store()
|
|
177
|
+
|
|
178
|
+
self.log("Searching for documents in AstraDBGraphVectorStore.")
|
|
179
|
+
self.log(f"Search query: {self.search_query}")
|
|
180
|
+
self.log(f"Search type: {self.search_type}")
|
|
181
|
+
self.log(f"Number of results: {self.number_of_results}")
|
|
182
|
+
|
|
183
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
|
184
|
+
try:
|
|
185
|
+
search_type = self._map_search_type()
|
|
186
|
+
search_args = self._build_search_args()
|
|
187
|
+
|
|
188
|
+
docs = vector_store.search(query=self.search_query, search_type=search_type, **search_args)
|
|
189
|
+
|
|
190
|
+
# Drop links from the metadata. At this point the links don't add any value for building the
|
|
191
|
+
# context and haven't been restored to json which causes the conversion to fail.
|
|
192
|
+
self.log("Removing links from metadata.")
|
|
193
|
+
for doc in docs:
|
|
194
|
+
if "links" in doc.metadata:
|
|
195
|
+
doc.metadata.pop("links")
|
|
196
|
+
|
|
197
|
+
except Exception as e:
|
|
198
|
+
msg = f"Error performing search in AstraDBGraphVectorStore: {e}"
|
|
199
|
+
raise ValueError(msg) from e
|
|
200
|
+
|
|
201
|
+
self.log(f"Retrieved documents: {len(docs)}")
|
|
202
|
+
|
|
203
|
+
data = docs_to_data(docs)
|
|
204
|
+
|
|
205
|
+
self.log(f"Converted documents to data: {len(data)}")
|
|
206
|
+
|
|
207
|
+
self.status = data
|
|
208
|
+
return data
|
|
209
|
+
self.log("No search input provided. Skipping search.")
|
|
210
|
+
return []
|
|
211
|
+
|
|
212
|
+
def get_retriever_kwargs(self):
|
|
213
|
+
search_args = self._build_search_args()
|
|
214
|
+
return {
|
|
215
|
+
"search_type": self._map_search_type(),
|
|
216
|
+
"search_kwargs": search_args,
|
|
217
|
+
}
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
from datetime import datetime, timezone
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from astrapy import Collection, DataAPIClient, Database
|
|
5
|
+
from langchain_core.tools import StructuredTool, Tool
|
|
6
|
+
from pydantic import BaseModel, Field, create_model
|
|
7
|
+
|
|
8
|
+
from lfx.base.datastax.astradb_base import AstraDBBaseComponent
|
|
9
|
+
from lfx.base.langchain_utilities.model import LCToolComponent
|
|
10
|
+
from lfx.io import BoolInput, DictInput, IntInput, StrInput, TableInput
|
|
11
|
+
from lfx.log.logger import logger
|
|
12
|
+
from lfx.schema.data import Data
|
|
13
|
+
from lfx.schema.table import EditMode
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class AstraDBToolComponent(AstraDBBaseComponent, LCToolComponent):
|
|
17
|
+
display_name: str = "Astra DB Tool"
|
|
18
|
+
description: str = "Tool to run hybrid vector and metadata search on DataStax Astra DB Collection"
|
|
19
|
+
documentation: str = "https://docs.langflow.org/bundles-datastax"
|
|
20
|
+
icon: str = "AstraDB"
|
|
21
|
+
legacy: bool = True
|
|
22
|
+
name = "AstraDBTool"
|
|
23
|
+
replacement = ["datastax.AstraDB"]
|
|
24
|
+
|
|
25
|
+
inputs = [
|
|
26
|
+
*AstraDBBaseComponent.inputs,
|
|
27
|
+
StrInput(
|
|
28
|
+
name="tool_name",
|
|
29
|
+
display_name="Tool Name",
|
|
30
|
+
info="The name of the tool to be passed to the LLM.",
|
|
31
|
+
required=True,
|
|
32
|
+
),
|
|
33
|
+
StrInput(
|
|
34
|
+
name="tool_description",
|
|
35
|
+
display_name="Tool Description",
|
|
36
|
+
info="Describe the tool to LLM. Add any information that can help the LLM to use the tool.",
|
|
37
|
+
required=True,
|
|
38
|
+
),
|
|
39
|
+
StrInput(
|
|
40
|
+
name="projection_attributes",
|
|
41
|
+
display_name="Projection Attributes",
|
|
42
|
+
info="Attributes to be returned by the tool separated by comma.",
|
|
43
|
+
required=True,
|
|
44
|
+
value="*",
|
|
45
|
+
advanced=True,
|
|
46
|
+
),
|
|
47
|
+
TableInput(
|
|
48
|
+
name="tools_params_v2",
|
|
49
|
+
display_name="Tools Parameters",
|
|
50
|
+
info="Define the structure for the tool parameters. Describe the parameters "
|
|
51
|
+
"in a way the LLM can understand how to use them.",
|
|
52
|
+
required=False,
|
|
53
|
+
table_schema=[
|
|
54
|
+
{
|
|
55
|
+
"name": "name",
|
|
56
|
+
"display_name": "Name",
|
|
57
|
+
"type": "str",
|
|
58
|
+
"description": "Specify the name of the output field/parameter for the model.",
|
|
59
|
+
"default": "field",
|
|
60
|
+
"edit_mode": EditMode.INLINE,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"name": "attribute_name",
|
|
64
|
+
"display_name": "Attribute Name",
|
|
65
|
+
"type": "str",
|
|
66
|
+
"description": "Specify the attribute name to be filtered on the collection. "
|
|
67
|
+
"Leave empty if the attribute name is the same as the name of the field.",
|
|
68
|
+
"default": "",
|
|
69
|
+
"edit_mode": EditMode.INLINE,
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"name": "description",
|
|
73
|
+
"display_name": "Description",
|
|
74
|
+
"type": "str",
|
|
75
|
+
"description": "Describe the purpose of the output field.",
|
|
76
|
+
"default": "description of field",
|
|
77
|
+
"edit_mode": EditMode.POPOVER,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "metadata",
|
|
81
|
+
"display_name": "Is Metadata",
|
|
82
|
+
"type": "boolean",
|
|
83
|
+
"edit_mode": EditMode.INLINE,
|
|
84
|
+
"description": ("Indicate if the field is included in the metadata field."),
|
|
85
|
+
"options": ["True", "False"],
|
|
86
|
+
"default": "False",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"name": "mandatory",
|
|
90
|
+
"display_name": "Is Mandatory",
|
|
91
|
+
"type": "boolean",
|
|
92
|
+
"edit_mode": EditMode.INLINE,
|
|
93
|
+
"description": ("Indicate if the field is mandatory."),
|
|
94
|
+
"options": ["True", "False"],
|
|
95
|
+
"default": "False",
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"name": "is_timestamp",
|
|
99
|
+
"display_name": "Is Timestamp",
|
|
100
|
+
"type": "boolean",
|
|
101
|
+
"edit_mode": EditMode.INLINE,
|
|
102
|
+
"description": ("Indicate if the field is a timestamp."),
|
|
103
|
+
"options": ["True", "False"],
|
|
104
|
+
"default": "False",
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"name": "operator",
|
|
108
|
+
"display_name": "Operator",
|
|
109
|
+
"type": "str",
|
|
110
|
+
"description": "Set the operator for the field. "
|
|
111
|
+
"https://docs.datastax.com/en/astra-db-serverless/api-reference/documents.html#operators",
|
|
112
|
+
"default": "$eq",
|
|
113
|
+
"options": ["$gt", "$gte", "$lt", "$lte", "$eq", "$ne", "$in", "$nin", "$exists", "$all", "$size"],
|
|
114
|
+
"edit_mode": EditMode.INLINE,
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
value=[],
|
|
118
|
+
),
|
|
119
|
+
DictInput(
|
|
120
|
+
name="tool_params",
|
|
121
|
+
info="DEPRECATED: Attributes to filter and description to the model. "
|
|
122
|
+
"Add ! for mandatory (e.g: !customerId)",
|
|
123
|
+
display_name="Tool params",
|
|
124
|
+
is_list=True,
|
|
125
|
+
advanced=True,
|
|
126
|
+
),
|
|
127
|
+
DictInput(
|
|
128
|
+
name="static_filters",
|
|
129
|
+
info="Attributes to filter and correspoding value",
|
|
130
|
+
display_name="Static filters",
|
|
131
|
+
advanced=True,
|
|
132
|
+
is_list=True,
|
|
133
|
+
),
|
|
134
|
+
IntInput(
|
|
135
|
+
name="number_of_results",
|
|
136
|
+
display_name="Number of Results",
|
|
137
|
+
info="Number of results to return.",
|
|
138
|
+
advanced=True,
|
|
139
|
+
value=5,
|
|
140
|
+
),
|
|
141
|
+
BoolInput(
|
|
142
|
+
name="use_search_query",
|
|
143
|
+
display_name="Semantic Search",
|
|
144
|
+
info="When this parameter is activated, the search query parameter will be used to search the collection.",
|
|
145
|
+
advanced=False,
|
|
146
|
+
value=False,
|
|
147
|
+
),
|
|
148
|
+
BoolInput(
|
|
149
|
+
name="use_vectorize",
|
|
150
|
+
display_name="Use Astra DB Vectorize",
|
|
151
|
+
info="When this parameter is activated, Astra DB Vectorize method will be used to generate the embeddings.",
|
|
152
|
+
advanced=False,
|
|
153
|
+
value=False,
|
|
154
|
+
),
|
|
155
|
+
StrInput(
|
|
156
|
+
name="semantic_search_instruction",
|
|
157
|
+
display_name="Semantic Search Instruction",
|
|
158
|
+
info="The instruction to use for the semantic search.",
|
|
159
|
+
required=True,
|
|
160
|
+
value="Search query to find relevant documents.",
|
|
161
|
+
advanced=True,
|
|
162
|
+
),
|
|
163
|
+
]
|
|
164
|
+
|
|
165
|
+
_cached_client: DataAPIClient | None = None
|
|
166
|
+
_cached_db: Database | None = None
|
|
167
|
+
_cached_collection: Collection | None = None
|
|
168
|
+
|
|
169
|
+
def create_args_schema(self) -> dict[str, BaseModel]:
|
|
170
|
+
"""DEPRECATED: This method is deprecated. Please use create_args_schema_v2 instead.
|
|
171
|
+
|
|
172
|
+
It is keep only for backward compatibility.
|
|
173
|
+
"""
|
|
174
|
+
logger.warning("This is the old way to define the tool parameters. Please use the new way.")
|
|
175
|
+
args: dict[str, tuple[Any, Field] | list[str]] = {}
|
|
176
|
+
|
|
177
|
+
for key in self.tool_params:
|
|
178
|
+
if key.startswith("!"): # Mandatory
|
|
179
|
+
args[key[1:]] = (str, Field(description=self.tool_params[key]))
|
|
180
|
+
else: # Optional
|
|
181
|
+
args[key] = (str | None, Field(description=self.tool_params[key], default=None))
|
|
182
|
+
|
|
183
|
+
if self.use_search_query:
|
|
184
|
+
args["search_query"] = (
|
|
185
|
+
str | None,
|
|
186
|
+
Field(description="Search query to find relevant documents.", default=None),
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
model = create_model("ToolInput", **args, __base__=BaseModel)
|
|
190
|
+
return {"ToolInput": model}
|
|
191
|
+
|
|
192
|
+
def create_args_schema_v2(self) -> dict[str, BaseModel]:
|
|
193
|
+
"""Create the tool input schema using the new tool parameters configuration."""
|
|
194
|
+
args: dict[str, tuple[Any, Field] | list[str]] = {}
|
|
195
|
+
|
|
196
|
+
for tool_param in self.tools_params_v2:
|
|
197
|
+
if tool_param["mandatory"]:
|
|
198
|
+
args[tool_param["name"]] = (str, Field(description=tool_param["description"]))
|
|
199
|
+
else:
|
|
200
|
+
args[tool_param["name"]] = (str | None, Field(description=tool_param["description"], default=None))
|
|
201
|
+
|
|
202
|
+
if self.use_search_query:
|
|
203
|
+
args["search_query"] = (
|
|
204
|
+
str,
|
|
205
|
+
Field(description=self.semantic_search_instruction),
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
model = create_model("ToolInput", **args, __base__=BaseModel)
|
|
209
|
+
return {"ToolInput": model}
|
|
210
|
+
|
|
211
|
+
def build_tool(self) -> Tool:
|
|
212
|
+
"""Builds an Astra DB Collection tool.
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
Tool: The built Astra DB tool.
|
|
216
|
+
"""
|
|
217
|
+
schema_dict = self.create_args_schema() if len(self.tool_params.keys()) > 0 else self.create_args_schema_v2()
|
|
218
|
+
|
|
219
|
+
tool = StructuredTool.from_function(
|
|
220
|
+
name=self.tool_name,
|
|
221
|
+
args_schema=schema_dict["ToolInput"],
|
|
222
|
+
description=self.tool_description,
|
|
223
|
+
func=self.run_model,
|
|
224
|
+
return_direct=False,
|
|
225
|
+
)
|
|
226
|
+
self.status = "Astra DB Tool created"
|
|
227
|
+
|
|
228
|
+
return tool
|
|
229
|
+
|
|
230
|
+
def projection_args(self, input_str: str) -> dict | None:
|
|
231
|
+
"""Build the projection arguments for the Astra DB query."""
|
|
232
|
+
elements = input_str.split(",")
|
|
233
|
+
result = {}
|
|
234
|
+
|
|
235
|
+
if elements == ["*"]:
|
|
236
|
+
return None
|
|
237
|
+
|
|
238
|
+
# Force the projection to exclude the $vector field as it is not required by the tool
|
|
239
|
+
result["$vector"] = False
|
|
240
|
+
|
|
241
|
+
# Fields with ! as prefix should be removed from the projection
|
|
242
|
+
for element in elements:
|
|
243
|
+
if element.startswith("!"):
|
|
244
|
+
result[element[1:]] = False
|
|
245
|
+
else:
|
|
246
|
+
result[element] = True
|
|
247
|
+
|
|
248
|
+
return result
|
|
249
|
+
|
|
250
|
+
def parse_timestamp(self, timestamp_str: str) -> datetime:
|
|
251
|
+
"""Parse a timestamp string into Astra DB REST API format.
|
|
252
|
+
|
|
253
|
+
Args:
|
|
254
|
+
timestamp_str (str): Input timestamp string
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
datetime: Datetime object
|
|
258
|
+
|
|
259
|
+
Raises:
|
|
260
|
+
ValueError: If the timestamp cannot be parsed
|
|
261
|
+
"""
|
|
262
|
+
# Common datetime formats to try
|
|
263
|
+
formats = [
|
|
264
|
+
"%Y-%m-%d", # 2024-03-21
|
|
265
|
+
"%Y-%m-%dT%H:%M:%S", # 2024-03-21T15:30:00
|
|
266
|
+
"%Y-%m-%dT%H:%M:%S%z", # 2024-03-21T15:30:00+0000
|
|
267
|
+
"%Y-%m-%d %H:%M:%S", # 2024-03-21 15:30:00
|
|
268
|
+
"%d/%m/%Y", # 21/03/2024
|
|
269
|
+
"%Y/%m/%d", # 2024/03/21
|
|
270
|
+
]
|
|
271
|
+
|
|
272
|
+
for fmt in formats:
|
|
273
|
+
try:
|
|
274
|
+
# Parse the date string
|
|
275
|
+
date_obj = datetime.strptime(timestamp_str, fmt).astimezone()
|
|
276
|
+
|
|
277
|
+
# If the parsed date has no timezone info, assume UTC
|
|
278
|
+
if date_obj.tzinfo is None:
|
|
279
|
+
date_obj = date_obj.replace(tzinfo=timezone.utc)
|
|
280
|
+
|
|
281
|
+
# Convert to UTC and format
|
|
282
|
+
return date_obj.astimezone(timezone.utc)
|
|
283
|
+
|
|
284
|
+
except ValueError:
|
|
285
|
+
continue
|
|
286
|
+
|
|
287
|
+
msg = f"Could not parse date: {timestamp_str}"
|
|
288
|
+
logger.error(msg)
|
|
289
|
+
raise ValueError(msg)
|
|
290
|
+
|
|
291
|
+
def build_filter(self, args: dict, filter_settings: list) -> dict:
|
|
292
|
+
"""Build filter dictionary for Astra DB query.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
args: Dictionary of arguments from the tool
|
|
296
|
+
filter_settings: List of filter settings from tools_params_v2
|
|
297
|
+
Returns:
|
|
298
|
+
Dictionary containing the filter conditions
|
|
299
|
+
"""
|
|
300
|
+
filters = {**self.static_filters}
|
|
301
|
+
|
|
302
|
+
for key, value in args.items():
|
|
303
|
+
# Skip search_query as it's handled separately
|
|
304
|
+
if key == "search_query":
|
|
305
|
+
continue
|
|
306
|
+
|
|
307
|
+
filter_setting = next((x for x in filter_settings if x["name"] == key), None)
|
|
308
|
+
if filter_setting and value is not None:
|
|
309
|
+
field_name = filter_setting["attribute_name"] if filter_setting["attribute_name"] else key
|
|
310
|
+
filter_key = field_name if not filter_setting["metadata"] else f"metadata.{field_name}"
|
|
311
|
+
if filter_setting["operator"] == "$exists":
|
|
312
|
+
filters[filter_key] = {**filters.get(filter_key, {}), filter_setting["operator"]: True}
|
|
313
|
+
elif filter_setting["operator"] in ["$in", "$nin", "$all"]:
|
|
314
|
+
filters[filter_key] = {
|
|
315
|
+
**filters.get(filter_key, {}),
|
|
316
|
+
filter_setting["operator"]: value.split(",") if isinstance(value, str) else value,
|
|
317
|
+
}
|
|
318
|
+
elif filter_setting["is_timestamp"] == True: # noqa: E712
|
|
319
|
+
try:
|
|
320
|
+
filters[filter_key] = {
|
|
321
|
+
**filters.get(filter_key, {}),
|
|
322
|
+
filter_setting["operator"]: self.parse_timestamp(value),
|
|
323
|
+
}
|
|
324
|
+
except ValueError as e:
|
|
325
|
+
msg = f"Error parsing timestamp: {e} - Use the prompt to specify the date in the correct format"
|
|
326
|
+
logger.error(msg)
|
|
327
|
+
raise ValueError(msg) from e
|
|
328
|
+
else:
|
|
329
|
+
filters[filter_key] = {**filters.get(filter_key, {}), filter_setting["operator"]: value}
|
|
330
|
+
return filters
|
|
331
|
+
|
|
332
|
+
def run_model(self, **args) -> Data | list[Data]:
|
|
333
|
+
"""Run the query to get the data from the Astra DB collection."""
|
|
334
|
+
sort = {}
|
|
335
|
+
|
|
336
|
+
# Build filters using the new method
|
|
337
|
+
filters = self.build_filter(args, self.tools_params_v2)
|
|
338
|
+
|
|
339
|
+
# Build the vector search on
|
|
340
|
+
if self.use_search_query and args["search_query"] is not None and args["search_query"] != "":
|
|
341
|
+
if self.use_vectorize:
|
|
342
|
+
sort["$vectorize"] = args["search_query"]
|
|
343
|
+
else:
|
|
344
|
+
if self.embedding is None:
|
|
345
|
+
msg = "Embedding model is not set. Please set the embedding model or use Astra DB Vectorize."
|
|
346
|
+
logger.error(msg)
|
|
347
|
+
raise ValueError(msg)
|
|
348
|
+
embedding_query = self.embedding.embed_query(args["search_query"])
|
|
349
|
+
sort["$vector"] = embedding_query
|
|
350
|
+
del args["search_query"]
|
|
351
|
+
|
|
352
|
+
find_options = {
|
|
353
|
+
"filter": filters,
|
|
354
|
+
"limit": self.number_of_results,
|
|
355
|
+
"sort": sort,
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
projection = self.projection_args(self.projection_attributes)
|
|
359
|
+
if projection and len(projection) > 0:
|
|
360
|
+
find_options["projection"] = projection
|
|
361
|
+
|
|
362
|
+
try:
|
|
363
|
+
database = self.get_database_object(api_endpoint=self.get_api_endpoint())
|
|
364
|
+
collection = database.get_collection(
|
|
365
|
+
name=self.collection_name,
|
|
366
|
+
keyspace=self.get_keyspace(),
|
|
367
|
+
)
|
|
368
|
+
results = collection.find(**find_options)
|
|
369
|
+
except Exception as e:
|
|
370
|
+
msg = f"Error on Astra DB Tool {self.tool_name} request: {e}"
|
|
371
|
+
logger.error(msg)
|
|
372
|
+
raise ValueError(msg) from e
|
|
373
|
+
|
|
374
|
+
logger.info(f"Tool {self.tool_name} executed`")
|
|
375
|
+
|
|
376
|
+
data: list[Data] = [Data(data=doc) for doc in results]
|
|
377
|
+
self.status = data
|
|
378
|
+
return data
|