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,896 @@
|
|
|
1
|
+
import re
|
|
2
|
+
from collections import defaultdict
|
|
3
|
+
from dataclasses import asdict, dataclass, field
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from astrapy import DataAPIClient, Database
|
|
7
|
+
from langchain_astradb.utils.astradb import _AstraDBCollectionEnvironment
|
|
8
|
+
|
|
9
|
+
from lfx.custom.custom_component.component import Component
|
|
10
|
+
from lfx.io import (
|
|
11
|
+
BoolInput,
|
|
12
|
+
DropdownInput,
|
|
13
|
+
IntInput,
|
|
14
|
+
SecretStrInput,
|
|
15
|
+
StrInput,
|
|
16
|
+
)
|
|
17
|
+
from lfx.log.logger import logger
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class AstraDBBaseComponent(Component):
|
|
21
|
+
"""Base class for AstraDB components with common functionality."""
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class NewDatabaseInput:
|
|
25
|
+
functionality: str = "create"
|
|
26
|
+
fields: dict[str, dict] = field(
|
|
27
|
+
default_factory=lambda: {
|
|
28
|
+
"data": {
|
|
29
|
+
"node": {
|
|
30
|
+
"name": "create_database",
|
|
31
|
+
"description": "Please allow several minutes for creation to complete.",
|
|
32
|
+
"display_name": "Create new database",
|
|
33
|
+
"field_order": ["01_new_database_name", "02_cloud_provider", "03_region"],
|
|
34
|
+
"template": {
|
|
35
|
+
"01_new_database_name": StrInput(
|
|
36
|
+
name="new_database_name",
|
|
37
|
+
display_name="Name",
|
|
38
|
+
info="Name of the new database to create in Astra DB.",
|
|
39
|
+
required=True,
|
|
40
|
+
),
|
|
41
|
+
"02_cloud_provider": DropdownInput(
|
|
42
|
+
name="cloud_provider",
|
|
43
|
+
display_name="Cloud provider",
|
|
44
|
+
info="Cloud provider for the new database.",
|
|
45
|
+
options=[],
|
|
46
|
+
required=True,
|
|
47
|
+
real_time_refresh=True,
|
|
48
|
+
),
|
|
49
|
+
"03_region": DropdownInput(
|
|
50
|
+
name="region",
|
|
51
|
+
display_name="Region",
|
|
52
|
+
info="Region for the new database.",
|
|
53
|
+
options=[],
|
|
54
|
+
required=True,
|
|
55
|
+
),
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
@dataclass
|
|
63
|
+
class NewCollectionInput:
|
|
64
|
+
functionality: str = "create"
|
|
65
|
+
fields: dict[str, dict] = field(
|
|
66
|
+
default_factory=lambda: {
|
|
67
|
+
"data": {
|
|
68
|
+
"node": {
|
|
69
|
+
"name": "create_collection",
|
|
70
|
+
"description": "Please allow several seconds for creation to complete.",
|
|
71
|
+
"display_name": "Create new collection",
|
|
72
|
+
"field_order": [
|
|
73
|
+
"01_new_collection_name",
|
|
74
|
+
"02_embedding_generation_provider",
|
|
75
|
+
"03_embedding_generation_model",
|
|
76
|
+
"04_dimension",
|
|
77
|
+
],
|
|
78
|
+
"template": {
|
|
79
|
+
"01_new_collection_name": StrInput(
|
|
80
|
+
name="new_collection_name",
|
|
81
|
+
display_name="Name",
|
|
82
|
+
info="Name of the new collection to create in Astra DB.",
|
|
83
|
+
required=True,
|
|
84
|
+
),
|
|
85
|
+
"02_embedding_generation_provider": DropdownInput(
|
|
86
|
+
name="embedding_generation_provider",
|
|
87
|
+
display_name="Embedding generation method",
|
|
88
|
+
info="Provider to use for generating embeddings.",
|
|
89
|
+
helper_text=(
|
|
90
|
+
"To create collections with more embedding provider options, go to "
|
|
91
|
+
'<a class="underline" href="https://astra.datastax.com/" target=" _blank" '
|
|
92
|
+
'rel="noopener noreferrer">your database in Astra DB</a>'
|
|
93
|
+
),
|
|
94
|
+
real_time_refresh=True,
|
|
95
|
+
required=True,
|
|
96
|
+
options=[],
|
|
97
|
+
),
|
|
98
|
+
"03_embedding_generation_model": DropdownInput(
|
|
99
|
+
name="embedding_generation_model",
|
|
100
|
+
display_name="Embedding model",
|
|
101
|
+
info="Model to use for generating embeddings.",
|
|
102
|
+
real_time_refresh=True,
|
|
103
|
+
options=[],
|
|
104
|
+
),
|
|
105
|
+
"04_dimension": IntInput(
|
|
106
|
+
name="dimension",
|
|
107
|
+
display_name="Dimensions",
|
|
108
|
+
info="Dimensions of the embeddings to generate.",
|
|
109
|
+
value=None,
|
|
110
|
+
),
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
inputs = [
|
|
118
|
+
SecretStrInput(
|
|
119
|
+
name="token",
|
|
120
|
+
display_name="Astra DB Application Token",
|
|
121
|
+
info="Authentication token for accessing Astra DB.",
|
|
122
|
+
value="ASTRA_DB_APPLICATION_TOKEN",
|
|
123
|
+
required=True,
|
|
124
|
+
real_time_refresh=True,
|
|
125
|
+
input_types=[],
|
|
126
|
+
),
|
|
127
|
+
DropdownInput(
|
|
128
|
+
name="environment",
|
|
129
|
+
display_name="Environment",
|
|
130
|
+
info="The environment for the Astra DB API Endpoint.",
|
|
131
|
+
options=["prod", "test", "dev"],
|
|
132
|
+
value="prod",
|
|
133
|
+
advanced=True,
|
|
134
|
+
real_time_refresh=True,
|
|
135
|
+
combobox=True,
|
|
136
|
+
),
|
|
137
|
+
DropdownInput(
|
|
138
|
+
name="database_name",
|
|
139
|
+
display_name="Database",
|
|
140
|
+
info="The Database name for the Astra DB instance.",
|
|
141
|
+
required=True,
|
|
142
|
+
refresh_button=True,
|
|
143
|
+
real_time_refresh=True,
|
|
144
|
+
dialog_inputs=asdict(NewDatabaseInput()),
|
|
145
|
+
combobox=True,
|
|
146
|
+
),
|
|
147
|
+
DropdownInput(
|
|
148
|
+
name="api_endpoint",
|
|
149
|
+
display_name="Astra DB API Endpoint",
|
|
150
|
+
info="The API Endpoint for the Astra DB instance. Supercedes database selection.",
|
|
151
|
+
advanced=True,
|
|
152
|
+
),
|
|
153
|
+
DropdownInput(
|
|
154
|
+
name="keyspace",
|
|
155
|
+
display_name="Keyspace",
|
|
156
|
+
info="Optional keyspace within Astra DB to use for the collection.",
|
|
157
|
+
advanced=True,
|
|
158
|
+
options=[],
|
|
159
|
+
real_time_refresh=True,
|
|
160
|
+
),
|
|
161
|
+
DropdownInput(
|
|
162
|
+
name="collection_name",
|
|
163
|
+
display_name="Collection",
|
|
164
|
+
info="The name of the collection within Astra DB where the vectors will be stored.",
|
|
165
|
+
required=True,
|
|
166
|
+
refresh_button=True,
|
|
167
|
+
real_time_refresh=True,
|
|
168
|
+
dialog_inputs=asdict(NewCollectionInput()),
|
|
169
|
+
combobox=True,
|
|
170
|
+
show=False,
|
|
171
|
+
),
|
|
172
|
+
BoolInput(
|
|
173
|
+
name="autodetect_collection",
|
|
174
|
+
display_name="Autodetect Collection",
|
|
175
|
+
info="Boolean flag to determine whether to autodetect the collection.",
|
|
176
|
+
advanced=True,
|
|
177
|
+
value=True,
|
|
178
|
+
),
|
|
179
|
+
]
|
|
180
|
+
|
|
181
|
+
@classmethod
|
|
182
|
+
def get_environment(cls, environment: str | None = None) -> str:
|
|
183
|
+
if not environment:
|
|
184
|
+
return "prod"
|
|
185
|
+
return environment
|
|
186
|
+
|
|
187
|
+
@classmethod
|
|
188
|
+
def map_cloud_providers(cls, token: str, environment: str | None = None) -> dict[str, dict[str, Any]]:
|
|
189
|
+
"""Fetch all available cloud providers and regions."""
|
|
190
|
+
# Get the admin object
|
|
191
|
+
client = DataAPIClient(environment=cls.get_environment(environment))
|
|
192
|
+
admin_client = client.get_admin(token=token)
|
|
193
|
+
|
|
194
|
+
# Get the list of available regions
|
|
195
|
+
available_regions = admin_client.find_available_regions(only_org_enabled_regions=True)
|
|
196
|
+
|
|
197
|
+
provider_mapping: dict[str, dict[str, str]] = {
|
|
198
|
+
"AWS": {"name": "Amazon Web Services", "id": "aws"},
|
|
199
|
+
"GCP": {"name": "Google Cloud Platform", "id": "gcp"},
|
|
200
|
+
"Azure": {"name": "Microsoft Azure", "id": "azure"},
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
result: dict[str, dict[str, Any]] = {}
|
|
204
|
+
for region_info in available_regions:
|
|
205
|
+
cloud_provider = region_info.cloud_provider
|
|
206
|
+
region = region_info.name
|
|
207
|
+
|
|
208
|
+
if cloud_provider in provider_mapping:
|
|
209
|
+
provider_name = provider_mapping[cloud_provider]["name"]
|
|
210
|
+
provider_id = provider_mapping[cloud_provider]["id"]
|
|
211
|
+
|
|
212
|
+
if provider_name not in result:
|
|
213
|
+
result[provider_name] = {"id": provider_id, "regions": []}
|
|
214
|
+
|
|
215
|
+
result[provider_name]["regions"].append(region)
|
|
216
|
+
|
|
217
|
+
return result
|
|
218
|
+
|
|
219
|
+
@classmethod
|
|
220
|
+
def get_vectorize_providers(cls, token: str, environment: str | None = None, api_endpoint: str | None = None):
|
|
221
|
+
try:
|
|
222
|
+
# Get the admin object
|
|
223
|
+
client = DataAPIClient(environment=cls.get_environment(environment))
|
|
224
|
+
admin_client = client.get_admin()
|
|
225
|
+
db_admin = admin_client.get_database_admin(api_endpoint, token=token)
|
|
226
|
+
|
|
227
|
+
# Get the list of embedding providers
|
|
228
|
+
embedding_providers = db_admin.find_embedding_providers()
|
|
229
|
+
|
|
230
|
+
vectorize_providers_mapping = {}
|
|
231
|
+
# Map the provider display name to the provider key and models
|
|
232
|
+
for provider_key, provider_data in embedding_providers.embedding_providers.items():
|
|
233
|
+
# Get the provider display name and models
|
|
234
|
+
display_name = provider_data.display_name
|
|
235
|
+
models = [model.name for model in provider_data.models]
|
|
236
|
+
|
|
237
|
+
# Build our mapping
|
|
238
|
+
vectorize_providers_mapping[display_name] = [provider_key, models]
|
|
239
|
+
|
|
240
|
+
# Sort the resulting dictionary
|
|
241
|
+
return defaultdict(list, dict(sorted(vectorize_providers_mapping.items())))
|
|
242
|
+
except Exception as _: # noqa: BLE001
|
|
243
|
+
return {}
|
|
244
|
+
|
|
245
|
+
@classmethod
|
|
246
|
+
async def create_database_api(
|
|
247
|
+
cls,
|
|
248
|
+
new_database_name: str,
|
|
249
|
+
cloud_provider: str,
|
|
250
|
+
region: str,
|
|
251
|
+
token: str,
|
|
252
|
+
environment: str | None = None,
|
|
253
|
+
keyspace: str | None = None,
|
|
254
|
+
):
|
|
255
|
+
# Get the environment, set to prod if null like
|
|
256
|
+
my_env = cls.get_environment(environment)
|
|
257
|
+
|
|
258
|
+
# Initialize the Data API client
|
|
259
|
+
client = DataAPIClient(environment=my_env)
|
|
260
|
+
|
|
261
|
+
# Get the admin object
|
|
262
|
+
admin_client = client.get_admin(token=token)
|
|
263
|
+
|
|
264
|
+
# Raise a value error if name isn't provided
|
|
265
|
+
if not new_database_name:
|
|
266
|
+
msg = "Database name is required to create a new database."
|
|
267
|
+
raise ValueError(msg)
|
|
268
|
+
|
|
269
|
+
# Call the create database function
|
|
270
|
+
return await admin_client.async_create_database(
|
|
271
|
+
name=new_database_name,
|
|
272
|
+
cloud_provider=cls.map_cloud_providers(token=token, environment=my_env)[cloud_provider]["id"],
|
|
273
|
+
region=region,
|
|
274
|
+
keyspace=keyspace,
|
|
275
|
+
wait_until_active=False,
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
@classmethod
|
|
279
|
+
async def create_collection_api(
|
|
280
|
+
cls,
|
|
281
|
+
new_collection_name: str,
|
|
282
|
+
token: str,
|
|
283
|
+
api_endpoint: str,
|
|
284
|
+
environment: str | None = None,
|
|
285
|
+
keyspace: str | None = None,
|
|
286
|
+
dimension: int | None = None,
|
|
287
|
+
embedding_generation_provider: str | None = None,
|
|
288
|
+
embedding_generation_model: str | None = None,
|
|
289
|
+
):
|
|
290
|
+
# Build vectorize options, if needed
|
|
291
|
+
vectorize_options = None
|
|
292
|
+
if not dimension:
|
|
293
|
+
try:
|
|
294
|
+
from langchain_astradb import VectorServiceOptions
|
|
295
|
+
except ImportError as e:
|
|
296
|
+
msg = (
|
|
297
|
+
"langchain-astradb is required to create AstraDB collections with "
|
|
298
|
+
"Astra Vectorize embeddings. Please install it with "
|
|
299
|
+
"`pip install langchain-astradb`."
|
|
300
|
+
)
|
|
301
|
+
raise ImportError(msg) from e
|
|
302
|
+
|
|
303
|
+
environment = cls.get_environment(environment)
|
|
304
|
+
providers = cls.get_vectorize_providers(token=token, environment=environment, api_endpoint=api_endpoint)
|
|
305
|
+
vectorize_options = VectorServiceOptions(
|
|
306
|
+
provider=providers.get(embedding_generation_provider, [None, []])[0],
|
|
307
|
+
model_name=embedding_generation_model,
|
|
308
|
+
)
|
|
309
|
+
|
|
310
|
+
# Raise a value error if name isn't provided
|
|
311
|
+
if not new_collection_name:
|
|
312
|
+
msg = "Collection name is required to create a new collection."
|
|
313
|
+
raise ValueError(msg)
|
|
314
|
+
|
|
315
|
+
# Define the base arguments being passed to the create collection function
|
|
316
|
+
base_args = {
|
|
317
|
+
"collection_name": new_collection_name,
|
|
318
|
+
"token": token,
|
|
319
|
+
"api_endpoint": api_endpoint,
|
|
320
|
+
"keyspace": keyspace,
|
|
321
|
+
"environment": environment,
|
|
322
|
+
"embedding_dimension": dimension,
|
|
323
|
+
"collection_vector_service_options": vectorize_options,
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
_AstraDBCollectionEnvironment(**base_args)
|
|
327
|
+
|
|
328
|
+
@classmethod
|
|
329
|
+
def get_database_list_static(cls, token: str, environment: str | None = None):
|
|
330
|
+
environment = cls.get_environment(environment)
|
|
331
|
+
client = DataAPIClient(environment=environment)
|
|
332
|
+
|
|
333
|
+
# Get the admin object
|
|
334
|
+
admin_client = client.get_admin(token=token)
|
|
335
|
+
|
|
336
|
+
# Get the list of databases
|
|
337
|
+
db_list = admin_client.list_databases()
|
|
338
|
+
|
|
339
|
+
# Generate the api endpoint for each database
|
|
340
|
+
db_info_dict = {}
|
|
341
|
+
for db in db_list:
|
|
342
|
+
try:
|
|
343
|
+
# Get the API endpoint for the database
|
|
344
|
+
api_endpoints = [db_reg.api_endpoint for db_reg in db.regions]
|
|
345
|
+
|
|
346
|
+
# Get the number of collections
|
|
347
|
+
try:
|
|
348
|
+
# Get the number of collections in the database
|
|
349
|
+
num_collections = len(
|
|
350
|
+
client.get_database(
|
|
351
|
+
api_endpoints[0],
|
|
352
|
+
token=token,
|
|
353
|
+
).list_collection_names()
|
|
354
|
+
)
|
|
355
|
+
except Exception: # noqa: BLE001
|
|
356
|
+
if db.status != "PENDING":
|
|
357
|
+
continue
|
|
358
|
+
num_collections = 0
|
|
359
|
+
|
|
360
|
+
# Add the database to the dictionary
|
|
361
|
+
db_info_dict[db.name] = {
|
|
362
|
+
"api_endpoints": api_endpoints,
|
|
363
|
+
"keyspaces": db.keyspaces,
|
|
364
|
+
"collections": num_collections,
|
|
365
|
+
"status": db.status if db.status != "ACTIVE" else None,
|
|
366
|
+
"org_id": db.org_id if db.org_id else None,
|
|
367
|
+
}
|
|
368
|
+
except Exception as e: # noqa: BLE001
|
|
369
|
+
logger.debug("Failed to get metadata for database %s: %s", db.name, e)
|
|
370
|
+
|
|
371
|
+
return db_info_dict
|
|
372
|
+
|
|
373
|
+
def get_database_list(self):
|
|
374
|
+
return self.get_database_list_static(
|
|
375
|
+
token=self.token,
|
|
376
|
+
environment=self.environment,
|
|
377
|
+
)
|
|
378
|
+
|
|
379
|
+
@classmethod
|
|
380
|
+
def get_api_endpoint_static(
|
|
381
|
+
cls,
|
|
382
|
+
token: str,
|
|
383
|
+
environment: str | None = None,
|
|
384
|
+
api_endpoint: str | None = None,
|
|
385
|
+
database_name: str | None = None,
|
|
386
|
+
):
|
|
387
|
+
# If the api_endpoint is set, return it
|
|
388
|
+
if api_endpoint:
|
|
389
|
+
return api_endpoint
|
|
390
|
+
|
|
391
|
+
# Check if the database_name is like a url
|
|
392
|
+
if database_name and database_name.startswith("https://"):
|
|
393
|
+
return database_name
|
|
394
|
+
|
|
395
|
+
# If the database is not set, nothing we can do.
|
|
396
|
+
if not database_name:
|
|
397
|
+
return None
|
|
398
|
+
|
|
399
|
+
# Grab the database object
|
|
400
|
+
environment = cls.get_environment(environment)
|
|
401
|
+
db = cls.get_database_list_static(token=token, environment=environment).get(database_name)
|
|
402
|
+
if not db:
|
|
403
|
+
return None
|
|
404
|
+
|
|
405
|
+
# Otherwise, get the URL from the database list
|
|
406
|
+
endpoints = db.get("api_endpoints") or []
|
|
407
|
+
return endpoints[0] if endpoints else None
|
|
408
|
+
|
|
409
|
+
def get_api_endpoint(self):
|
|
410
|
+
return self.get_api_endpoint_static(
|
|
411
|
+
token=self.token,
|
|
412
|
+
environment=self.environment,
|
|
413
|
+
api_endpoint=self.api_endpoint,
|
|
414
|
+
database_name=self.database_name,
|
|
415
|
+
)
|
|
416
|
+
|
|
417
|
+
@classmethod
|
|
418
|
+
def get_database_id_static(cls, api_endpoint: str) -> str | None:
|
|
419
|
+
# Pattern matches standard UUID format: 8-4-4-4-12 hexadecimal characters
|
|
420
|
+
uuid_pattern = r"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}"
|
|
421
|
+
match = re.search(uuid_pattern, api_endpoint)
|
|
422
|
+
|
|
423
|
+
return match.group(0) if match else None
|
|
424
|
+
|
|
425
|
+
def get_database_id(self):
|
|
426
|
+
return self.get_database_id_static(api_endpoint=self.get_api_endpoint())
|
|
427
|
+
|
|
428
|
+
def get_keyspace(self):
|
|
429
|
+
keyspace = self.keyspace
|
|
430
|
+
|
|
431
|
+
if keyspace:
|
|
432
|
+
return keyspace.strip()
|
|
433
|
+
|
|
434
|
+
return "default_keyspace"
|
|
435
|
+
|
|
436
|
+
def get_database_object(self, api_endpoint: str | None = None):
|
|
437
|
+
try:
|
|
438
|
+
client = DataAPIClient(environment=self.environment)
|
|
439
|
+
|
|
440
|
+
return client.get_database(
|
|
441
|
+
api_endpoint or self.get_api_endpoint(),
|
|
442
|
+
token=self.token,
|
|
443
|
+
keyspace=self.get_keyspace(),
|
|
444
|
+
)
|
|
445
|
+
except Exception as e:
|
|
446
|
+
msg = f"Error fetching database object: {e}"
|
|
447
|
+
raise ValueError(msg) from e
|
|
448
|
+
|
|
449
|
+
def collection_data(self, collection_name: str, database: Database = None):
|
|
450
|
+
try:
|
|
451
|
+
if not database:
|
|
452
|
+
client = DataAPIClient(environment=self.environment)
|
|
453
|
+
|
|
454
|
+
database = client.get_database(
|
|
455
|
+
self.get_api_endpoint(),
|
|
456
|
+
token=self.token,
|
|
457
|
+
keyspace=self.get_keyspace(),
|
|
458
|
+
)
|
|
459
|
+
|
|
460
|
+
collection = database.get_collection(collection_name)
|
|
461
|
+
|
|
462
|
+
return collection.estimated_document_count()
|
|
463
|
+
except Exception as e: # noqa: BLE001
|
|
464
|
+
self.log(f"Error checking collection data: {e}")
|
|
465
|
+
|
|
466
|
+
return None
|
|
467
|
+
|
|
468
|
+
def _initialize_database_options(self):
|
|
469
|
+
try:
|
|
470
|
+
return [
|
|
471
|
+
{
|
|
472
|
+
"name": name,
|
|
473
|
+
"status": info["status"],
|
|
474
|
+
"collections": info["collections"],
|
|
475
|
+
"api_endpoints": info["api_endpoints"],
|
|
476
|
+
"keyspaces": info["keyspaces"],
|
|
477
|
+
"org_id": info["org_id"],
|
|
478
|
+
}
|
|
479
|
+
for name, info in self.get_database_list().items()
|
|
480
|
+
]
|
|
481
|
+
except Exception as e:
|
|
482
|
+
msg = f"Error fetching database options: {e}"
|
|
483
|
+
raise ValueError(msg) from e
|
|
484
|
+
|
|
485
|
+
@classmethod
|
|
486
|
+
def get_provider_icon(cls, collection=None, provider_name: str | None = None) -> str:
|
|
487
|
+
# Get the provider name from the collection
|
|
488
|
+
provider_name = provider_name or (
|
|
489
|
+
collection.definition.vector.service.provider
|
|
490
|
+
if (
|
|
491
|
+
collection
|
|
492
|
+
and collection.definition
|
|
493
|
+
and collection.definition.vector
|
|
494
|
+
and collection.definition.vector.service
|
|
495
|
+
)
|
|
496
|
+
else None
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
# If there is no provider, use the vector store icon
|
|
500
|
+
if not provider_name or provider_name.lower() == "bring your own":
|
|
501
|
+
return "vectorstores"
|
|
502
|
+
|
|
503
|
+
# Map provider casings
|
|
504
|
+
case_map = {
|
|
505
|
+
"nvidia": "NVIDIA",
|
|
506
|
+
"openai": "OpenAI",
|
|
507
|
+
"amazon bedrock": "AmazonBedrockEmbeddings",
|
|
508
|
+
"azure openai": "AzureOpenAiEmbeddings",
|
|
509
|
+
"cohere": "Cohere",
|
|
510
|
+
"jina ai": "JinaAI",
|
|
511
|
+
"mistral ai": "MistralAI",
|
|
512
|
+
"upstage": "Upstage",
|
|
513
|
+
"voyage ai": "VoyageAI",
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
# Adjust the casing on some like nvidia
|
|
517
|
+
return case_map[provider_name.lower()] if provider_name.lower() in case_map else provider_name.title()
|
|
518
|
+
|
|
519
|
+
def _initialize_collection_options(self, api_endpoint: str | None = None):
|
|
520
|
+
# Nothing to generate if we don't have an API endpoint yet
|
|
521
|
+
api_endpoint = api_endpoint or self.get_api_endpoint()
|
|
522
|
+
if not api_endpoint:
|
|
523
|
+
return []
|
|
524
|
+
|
|
525
|
+
# Retrieve the database object
|
|
526
|
+
database = self.get_database_object(api_endpoint=api_endpoint)
|
|
527
|
+
|
|
528
|
+
# Get the list of collections
|
|
529
|
+
collection_list = database.list_collections(keyspace=self.get_keyspace())
|
|
530
|
+
|
|
531
|
+
# Return the list of collections and metadata associated
|
|
532
|
+
return [
|
|
533
|
+
{
|
|
534
|
+
"name": col.name,
|
|
535
|
+
"records": self.collection_data(collection_name=col.name, database=database),
|
|
536
|
+
"provider": (
|
|
537
|
+
col.definition.vector.service.provider
|
|
538
|
+
if col.definition.vector and col.definition.vector.service
|
|
539
|
+
else None
|
|
540
|
+
),
|
|
541
|
+
"icon": self.get_provider_icon(collection=col),
|
|
542
|
+
"model": (
|
|
543
|
+
col.definition.vector.service.model_name
|
|
544
|
+
if col.definition.vector and col.definition.vector.service
|
|
545
|
+
else None
|
|
546
|
+
),
|
|
547
|
+
}
|
|
548
|
+
for col in collection_list
|
|
549
|
+
]
|
|
550
|
+
|
|
551
|
+
def reset_provider_options(self, build_config: dict) -> dict:
|
|
552
|
+
"""Reset provider options and related configurations in the build_config dictionary."""
|
|
553
|
+
# Extract template path for cleaner access
|
|
554
|
+
template = build_config["collection_name"]["dialog_inputs"]["fields"]["data"]["node"]["template"]
|
|
555
|
+
|
|
556
|
+
# Get vectorize providers
|
|
557
|
+
vectorize_providers_api = self.get_vectorize_providers(
|
|
558
|
+
token=self.token,
|
|
559
|
+
environment=self.environment,
|
|
560
|
+
api_endpoint=build_config["api_endpoint"]["value"],
|
|
561
|
+
)
|
|
562
|
+
|
|
563
|
+
# Create a new dictionary with "Bring your own" first
|
|
564
|
+
vectorize_providers: dict[str, list[list[str]]] = {"Bring your own": [[], []]}
|
|
565
|
+
|
|
566
|
+
# Add the remaining items (only Nvidia) from the original dictionary
|
|
567
|
+
vectorize_providers.update(
|
|
568
|
+
{
|
|
569
|
+
k: v
|
|
570
|
+
for k, v in vectorize_providers_api.items()
|
|
571
|
+
if k.lower() in ["nvidia"] # TODO: Eventually support more
|
|
572
|
+
}
|
|
573
|
+
)
|
|
574
|
+
|
|
575
|
+
# Set provider options
|
|
576
|
+
provider_field = "02_embedding_generation_provider"
|
|
577
|
+
template[provider_field]["options"] = list(vectorize_providers.keys())
|
|
578
|
+
|
|
579
|
+
# Add metadata for each provider option
|
|
580
|
+
template[provider_field]["options_metadata"] = [
|
|
581
|
+
{"icon": self.get_provider_icon(provider_name=provider)} for provider in template[provider_field]["options"]
|
|
582
|
+
]
|
|
583
|
+
|
|
584
|
+
# Get selected embedding provider
|
|
585
|
+
embedding_provider = template[provider_field]["value"]
|
|
586
|
+
is_bring_your_own = embedding_provider and embedding_provider == "Bring your own"
|
|
587
|
+
|
|
588
|
+
# Configure embedding model field
|
|
589
|
+
model_field = "03_embedding_generation_model"
|
|
590
|
+
template[model_field].update(
|
|
591
|
+
{
|
|
592
|
+
"options": vectorize_providers.get(embedding_provider, [[], []])[1],
|
|
593
|
+
"placeholder": "Bring your own" if is_bring_your_own else None,
|
|
594
|
+
"readonly": is_bring_your_own,
|
|
595
|
+
"required": not is_bring_your_own,
|
|
596
|
+
"value": None,
|
|
597
|
+
}
|
|
598
|
+
)
|
|
599
|
+
|
|
600
|
+
# If this is a bring your own, set dimensions to 0
|
|
601
|
+
return self.reset_dimension_field(build_config)
|
|
602
|
+
|
|
603
|
+
def reset_dimension_field(self, build_config: dict) -> dict:
|
|
604
|
+
"""Reset dimension field options based on provided configuration."""
|
|
605
|
+
# Extract template path for cleaner access
|
|
606
|
+
template = build_config["collection_name"]["dialog_inputs"]["fields"]["data"]["node"]["template"]
|
|
607
|
+
|
|
608
|
+
# Get selected embedding model
|
|
609
|
+
provider_field = "02_embedding_generation_provider"
|
|
610
|
+
embedding_provider = template[provider_field]["value"]
|
|
611
|
+
is_bring_your_own = embedding_provider and embedding_provider == "Bring your own"
|
|
612
|
+
|
|
613
|
+
# Configure dimension field
|
|
614
|
+
dimension_field = "04_dimension"
|
|
615
|
+
dimension_value = 1024 if not is_bring_your_own else None # TODO: Dynamically figure this out
|
|
616
|
+
template[dimension_field].update(
|
|
617
|
+
{
|
|
618
|
+
"placeholder": dimension_value,
|
|
619
|
+
"value": dimension_value,
|
|
620
|
+
"readonly": not is_bring_your_own,
|
|
621
|
+
"required": is_bring_your_own,
|
|
622
|
+
}
|
|
623
|
+
)
|
|
624
|
+
|
|
625
|
+
return build_config
|
|
626
|
+
|
|
627
|
+
def reset_collection_list(self, build_config: dict) -> dict:
|
|
628
|
+
"""Reset collection list options based on provided configuration."""
|
|
629
|
+
# Get collection options
|
|
630
|
+
collection_options = self._initialize_collection_options(api_endpoint=build_config["api_endpoint"]["value"])
|
|
631
|
+
# Update collection configuration
|
|
632
|
+
collection_config = build_config["collection_name"]
|
|
633
|
+
collection_config.update(
|
|
634
|
+
{
|
|
635
|
+
"options": [col["name"] for col in collection_options],
|
|
636
|
+
"options_metadata": [{k: v for k, v in col.items() if k != "name"} for col in collection_options],
|
|
637
|
+
}
|
|
638
|
+
)
|
|
639
|
+
|
|
640
|
+
# Reset selected collection if not in options
|
|
641
|
+
if collection_config["value"] not in collection_config["options"]:
|
|
642
|
+
collection_config["value"] = ""
|
|
643
|
+
|
|
644
|
+
# Set advanced status based on database selection
|
|
645
|
+
collection_config["show"] = bool(build_config["database_name"]["value"])
|
|
646
|
+
|
|
647
|
+
return build_config
|
|
648
|
+
|
|
649
|
+
def reset_database_list(self, build_config: dict) -> dict:
|
|
650
|
+
"""Reset database list options and related configurations."""
|
|
651
|
+
# Get database options
|
|
652
|
+
database_options = self._initialize_database_options()
|
|
653
|
+
|
|
654
|
+
# Update cloud provider options
|
|
655
|
+
template = build_config["database_name"]["dialog_inputs"]["fields"]["data"]["node"]["template"]
|
|
656
|
+
template["02_cloud_provider"]["options"] = list(
|
|
657
|
+
self.map_cloud_providers(
|
|
658
|
+
token=self.token,
|
|
659
|
+
environment=self.environment,
|
|
660
|
+
).keys()
|
|
661
|
+
)
|
|
662
|
+
|
|
663
|
+
# Update database configuration
|
|
664
|
+
database_config = build_config["database_name"]
|
|
665
|
+
database_config.update(
|
|
666
|
+
{
|
|
667
|
+
"options": [db["name"] for db in database_options],
|
|
668
|
+
"options_metadata": [{k: v for k, v in db.items() if k != "name"} for db in database_options],
|
|
669
|
+
}
|
|
670
|
+
)
|
|
671
|
+
|
|
672
|
+
# Reset selections if value not in options
|
|
673
|
+
if database_config["value"] not in database_config["options"]:
|
|
674
|
+
database_config["value"] = ""
|
|
675
|
+
build_config["api_endpoint"]["options"] = []
|
|
676
|
+
build_config["api_endpoint"]["value"] = ""
|
|
677
|
+
build_config["collection_name"]["show"] = False
|
|
678
|
+
|
|
679
|
+
# Set advanced status based on token presence
|
|
680
|
+
database_config["show"] = bool(build_config["token"]["value"])
|
|
681
|
+
|
|
682
|
+
return build_config
|
|
683
|
+
|
|
684
|
+
def reset_build_config(self, build_config: dict) -> dict:
|
|
685
|
+
"""Reset all build configuration options to default empty state."""
|
|
686
|
+
# Reset database configuration
|
|
687
|
+
database_config = build_config["database_name"]
|
|
688
|
+
database_config.update({"options": [], "options_metadata": [], "value": "", "show": False})
|
|
689
|
+
build_config["api_endpoint"]["options"] = []
|
|
690
|
+
build_config["api_endpoint"]["value"] = ""
|
|
691
|
+
|
|
692
|
+
# Reset collection configuration
|
|
693
|
+
collection_config = build_config["collection_name"]
|
|
694
|
+
collection_config.update({"options": [], "options_metadata": [], "value": "", "show": False})
|
|
695
|
+
|
|
696
|
+
return build_config
|
|
697
|
+
|
|
698
|
+
async def update_build_config(
|
|
699
|
+
self,
|
|
700
|
+
build_config: dict,
|
|
701
|
+
field_value: str | dict,
|
|
702
|
+
field_name: str | None = None,
|
|
703
|
+
) -> dict:
|
|
704
|
+
"""Update build configuration based on field name and value."""
|
|
705
|
+
# Early return if no token provided
|
|
706
|
+
if not self.token:
|
|
707
|
+
return self.reset_build_config(build_config)
|
|
708
|
+
|
|
709
|
+
# Database creation callback
|
|
710
|
+
if field_name == "database_name" and isinstance(field_value, dict):
|
|
711
|
+
if "01_new_database_name" in field_value:
|
|
712
|
+
await self._create_new_database(build_config, field_value)
|
|
713
|
+
return self.reset_collection_list(build_config)
|
|
714
|
+
return self._update_cloud_regions(build_config, field_value)
|
|
715
|
+
|
|
716
|
+
# Collection creation callback
|
|
717
|
+
if field_name == "collection_name" and isinstance(field_value, dict):
|
|
718
|
+
# Case 1: New collection creation
|
|
719
|
+
if "01_new_collection_name" in field_value:
|
|
720
|
+
await self._create_new_collection(build_config, field_value)
|
|
721
|
+
return build_config
|
|
722
|
+
|
|
723
|
+
# Case 2: Update embedding provider options
|
|
724
|
+
if "02_embedding_generation_provider" in field_value:
|
|
725
|
+
return self.reset_provider_options(build_config)
|
|
726
|
+
|
|
727
|
+
# Case 3: Update dimension field
|
|
728
|
+
if "03_embedding_generation_model" in field_value:
|
|
729
|
+
return self.reset_dimension_field(build_config)
|
|
730
|
+
|
|
731
|
+
# Initial execution or token/environment change
|
|
732
|
+
first_run = field_name == "collection_name" and not field_value and not build_config["database_name"]["options"]
|
|
733
|
+
if first_run or field_name in {"token", "environment"}:
|
|
734
|
+
return self.reset_database_list(build_config)
|
|
735
|
+
|
|
736
|
+
# Database selection change
|
|
737
|
+
if field_name == "database_name" and not isinstance(field_value, dict):
|
|
738
|
+
return self._handle_database_selection(build_config, field_value)
|
|
739
|
+
|
|
740
|
+
# Keyspace selection change
|
|
741
|
+
if field_name == "keyspace":
|
|
742
|
+
return self.reset_collection_list(build_config)
|
|
743
|
+
|
|
744
|
+
# Collection selection change
|
|
745
|
+
if field_name == "collection_name" and not isinstance(field_value, dict):
|
|
746
|
+
return self._handle_collection_selection(build_config, field_value)
|
|
747
|
+
|
|
748
|
+
return build_config
|
|
749
|
+
|
|
750
|
+
async def _create_new_database(self, build_config: dict, field_value: dict) -> None:
|
|
751
|
+
"""Create a new database and update build config options."""
|
|
752
|
+
try:
|
|
753
|
+
await self.create_database_api(
|
|
754
|
+
new_database_name=field_value["01_new_database_name"],
|
|
755
|
+
token=self.token,
|
|
756
|
+
keyspace=self.get_keyspace(),
|
|
757
|
+
environment=self.environment,
|
|
758
|
+
cloud_provider=field_value["02_cloud_provider"],
|
|
759
|
+
region=field_value["03_region"],
|
|
760
|
+
)
|
|
761
|
+
except Exception as e:
|
|
762
|
+
msg = f"Error creating database: {e}"
|
|
763
|
+
raise ValueError(msg) from e
|
|
764
|
+
|
|
765
|
+
build_config["database_name"]["options"].append(field_value["01_new_database_name"])
|
|
766
|
+
build_config["database_name"]["options_metadata"].append(
|
|
767
|
+
{
|
|
768
|
+
"status": "PENDING",
|
|
769
|
+
"collections": 0,
|
|
770
|
+
"api_endpoints": [],
|
|
771
|
+
"keyspaces": [self.get_keyspace()],
|
|
772
|
+
"org_id": None,
|
|
773
|
+
}
|
|
774
|
+
)
|
|
775
|
+
|
|
776
|
+
def _update_cloud_regions(self, build_config: dict, field_value: dict) -> dict:
|
|
777
|
+
"""Update cloud provider regions in build config."""
|
|
778
|
+
cloud_provider = field_value["02_cloud_provider"]
|
|
779
|
+
|
|
780
|
+
# Update the region options based on the selected cloud provider
|
|
781
|
+
template = build_config["database_name"]["dialog_inputs"]["fields"]["data"]["node"]["template"]
|
|
782
|
+
template["03_region"]["options"] = self.map_cloud_providers(
|
|
783
|
+
token=self.token,
|
|
784
|
+
environment=self.environment,
|
|
785
|
+
)[cloud_provider]["regions"]
|
|
786
|
+
|
|
787
|
+
# Reset the the 03_region value if it's not in the new options
|
|
788
|
+
if template["03_region"]["value"] not in template["03_region"]["options"]:
|
|
789
|
+
template["03_region"]["value"] = None
|
|
790
|
+
|
|
791
|
+
return build_config
|
|
792
|
+
|
|
793
|
+
async def _create_new_collection(self, build_config: dict, field_value: dict) -> None:
|
|
794
|
+
"""Create a new collection and update build config options."""
|
|
795
|
+
embedding_provider = field_value.get("02_embedding_generation_provider")
|
|
796
|
+
try:
|
|
797
|
+
await self.create_collection_api(
|
|
798
|
+
new_collection_name=field_value["01_new_collection_name"],
|
|
799
|
+
token=self.token,
|
|
800
|
+
api_endpoint=build_config["api_endpoint"]["value"],
|
|
801
|
+
environment=self.environment,
|
|
802
|
+
keyspace=self.get_keyspace(),
|
|
803
|
+
dimension=field_value.get("04_dimension") if embedding_provider == "Bring your own" else None,
|
|
804
|
+
embedding_generation_provider=embedding_provider,
|
|
805
|
+
embedding_generation_model=field_value.get("03_embedding_generation_model"),
|
|
806
|
+
)
|
|
807
|
+
except Exception as e:
|
|
808
|
+
msg = f"Error creating collection: {e}"
|
|
809
|
+
raise ValueError(msg) from e
|
|
810
|
+
|
|
811
|
+
provider = embedding_provider.lower() if embedding_provider and embedding_provider != "Bring your own" else None
|
|
812
|
+
build_config["collection_name"].update(
|
|
813
|
+
{
|
|
814
|
+
"value": field_value["01_new_collection_name"],
|
|
815
|
+
"options": build_config["collection_name"]["options"] + [field_value["01_new_collection_name"]],
|
|
816
|
+
}
|
|
817
|
+
)
|
|
818
|
+
|
|
819
|
+
# Update collection metadata
|
|
820
|
+
build_config["collection_name"]["options_metadata"].append(
|
|
821
|
+
{
|
|
822
|
+
"records": 0,
|
|
823
|
+
"provider": provider,
|
|
824
|
+
"icon": self.get_provider_icon(provider_name=provider),
|
|
825
|
+
"model": field_value.get("03_embedding_generation_model"),
|
|
826
|
+
}
|
|
827
|
+
)
|
|
828
|
+
|
|
829
|
+
def _handle_database_selection(self, build_config: dict, field_value: str) -> dict:
|
|
830
|
+
"""Handle database selection and update related configurations."""
|
|
831
|
+
build_config = self.reset_database_list(build_config)
|
|
832
|
+
|
|
833
|
+
# Reset collection list if database selection changes
|
|
834
|
+
if field_value not in build_config["database_name"]["options"]:
|
|
835
|
+
build_config["database_name"]["value"] = ""
|
|
836
|
+
return build_config
|
|
837
|
+
|
|
838
|
+
# Get the api endpoint for the selected database
|
|
839
|
+
index = build_config["database_name"]["options"].index(field_value)
|
|
840
|
+
build_config["api_endpoint"]["options"] = build_config["database_name"]["options_metadata"][index][
|
|
841
|
+
"api_endpoints"
|
|
842
|
+
]
|
|
843
|
+
build_config["api_endpoint"]["value"] = build_config["database_name"]["options_metadata"][index][
|
|
844
|
+
"api_endpoints"
|
|
845
|
+
][0]
|
|
846
|
+
|
|
847
|
+
# Get the org_id for the selected database
|
|
848
|
+
org_id = build_config["database_name"]["options_metadata"][index]["org_id"]
|
|
849
|
+
if not org_id:
|
|
850
|
+
return build_config
|
|
851
|
+
|
|
852
|
+
# Update the list of keyspaces based on the db info
|
|
853
|
+
build_config["keyspace"]["options"] = build_config["database_name"]["options_metadata"][index]["keyspaces"]
|
|
854
|
+
build_config["keyspace"]["value"] = (
|
|
855
|
+
build_config["keyspace"]["options"] and build_config["keyspace"]["options"][0]
|
|
856
|
+
if build_config["keyspace"]["value"] not in build_config["keyspace"]["options"]
|
|
857
|
+
else build_config["keyspace"]["value"]
|
|
858
|
+
)
|
|
859
|
+
|
|
860
|
+
# Get the database id for the selected database
|
|
861
|
+
db_id = self.get_database_id_static(api_endpoint=build_config["api_endpoint"]["value"])
|
|
862
|
+
keyspace = self.get_keyspace()
|
|
863
|
+
|
|
864
|
+
# Update the helper text for the embedding provider field
|
|
865
|
+
template = build_config["collection_name"]["dialog_inputs"]["fields"]["data"]["node"]["template"]
|
|
866
|
+
template["02_embedding_generation_provider"]["helper_text"] = (
|
|
867
|
+
"To create collections with more embedding provider options, go to "
|
|
868
|
+
f'<a class="underline" target="_blank" rel="noopener noreferrer" '
|
|
869
|
+
f'href="https://astra.datastax.com/org/{org_id}/database/{db_id}/data-explorer?createCollection=1&namespace={keyspace}">'
|
|
870
|
+
"your database in Astra DB</a>."
|
|
871
|
+
)
|
|
872
|
+
|
|
873
|
+
# Reset provider options
|
|
874
|
+
build_config = self.reset_provider_options(build_config)
|
|
875
|
+
|
|
876
|
+
return self.reset_collection_list(build_config)
|
|
877
|
+
|
|
878
|
+
def _handle_collection_selection(self, build_config: dict, field_value: str) -> dict:
|
|
879
|
+
"""Handle collection selection and update embedding options."""
|
|
880
|
+
build_config["autodetect_collection"]["value"] = True
|
|
881
|
+
build_config = self.reset_collection_list(build_config)
|
|
882
|
+
|
|
883
|
+
# Reset embedding model if collection selection changes
|
|
884
|
+
if field_value and field_value not in build_config["collection_name"]["options"]:
|
|
885
|
+
build_config["collection_name"]["options"].append(field_value)
|
|
886
|
+
build_config["collection_name"]["options_metadata"].append(
|
|
887
|
+
{
|
|
888
|
+
"records": 0,
|
|
889
|
+
"provider": None,
|
|
890
|
+
"icon": "vectorstores",
|
|
891
|
+
"model": None,
|
|
892
|
+
}
|
|
893
|
+
)
|
|
894
|
+
build_config["autodetect_collection"]["value"] = False
|
|
895
|
+
|
|
896
|
+
return build_config
|