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,122 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from lfx.custom.custom_component.component import Component
|
|
4
|
+
from lfx.inputs.inputs import DictInput, DropdownInput, MessageTextInput, SecretStrInput
|
|
5
|
+
from lfx.template.field.base import Output
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AstraVectorizeComponent(Component):
|
|
9
|
+
display_name: str = "Astra Vectorize"
|
|
10
|
+
description: str = "Configuration options for Astra Vectorize server-side embeddings. "
|
|
11
|
+
documentation: str = "https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html"
|
|
12
|
+
legacy = True
|
|
13
|
+
icon = "AstraDB"
|
|
14
|
+
name = "AstraVectorize"
|
|
15
|
+
replacement = ["datastax.AstraDB"]
|
|
16
|
+
|
|
17
|
+
VECTORIZE_PROVIDERS_MAPPING = {
|
|
18
|
+
"Azure OpenAI": ["azureOpenAI", ["text-embedding-3-small", "text-embedding-3-large", "text-embedding-ada-002"]],
|
|
19
|
+
"Hugging Face - Dedicated": ["huggingfaceDedicated", ["endpoint-defined-model"]],
|
|
20
|
+
"Hugging Face - Serverless": [
|
|
21
|
+
"huggingface",
|
|
22
|
+
[
|
|
23
|
+
"sentence-transformers/all-MiniLM-L6-v2",
|
|
24
|
+
"intfloat/multilingual-e5-large",
|
|
25
|
+
"intfloat/multilingual-e5-large-instruct",
|
|
26
|
+
"BAAI/bge-small-en-v1.5",
|
|
27
|
+
"BAAI/bge-base-en-v1.5",
|
|
28
|
+
"BAAI/bge-large-en-v1.5",
|
|
29
|
+
],
|
|
30
|
+
],
|
|
31
|
+
"Jina AI": [
|
|
32
|
+
"jinaAI",
|
|
33
|
+
[
|
|
34
|
+
"jina-embeddings-v2-base-en",
|
|
35
|
+
"jina-embeddings-v2-base-de",
|
|
36
|
+
"jina-embeddings-v2-base-es",
|
|
37
|
+
"jina-embeddings-v2-base-code",
|
|
38
|
+
"jina-embeddings-v2-base-zh",
|
|
39
|
+
],
|
|
40
|
+
],
|
|
41
|
+
"Mistral AI": ["mistral", ["mistral-embed"]],
|
|
42
|
+
"NVIDIA": ["nvidia", ["NV-Embed-QA"]],
|
|
43
|
+
"OpenAI": ["openai", ["text-embedding-3-small", "text-embedding-3-large", "text-embedding-ada-002"]],
|
|
44
|
+
"Upstage": ["upstageAI", ["solar-embedding-1-large"]],
|
|
45
|
+
"Voyage AI": [
|
|
46
|
+
"voyageAI",
|
|
47
|
+
["voyage-large-2-instruct", "voyage-law-2", "voyage-code-2", "voyage-large-2", "voyage-2"],
|
|
48
|
+
],
|
|
49
|
+
}
|
|
50
|
+
VECTORIZE_MODELS_STR = "\n\n".join(
|
|
51
|
+
[provider + ": " + (", ".join(models[1])) for provider, models in VECTORIZE_PROVIDERS_MAPPING.items()]
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
inputs = [
|
|
55
|
+
DropdownInput(
|
|
56
|
+
name="provider",
|
|
57
|
+
display_name="Provider",
|
|
58
|
+
options=VECTORIZE_PROVIDERS_MAPPING.keys(),
|
|
59
|
+
value="",
|
|
60
|
+
required=True,
|
|
61
|
+
),
|
|
62
|
+
MessageTextInput(
|
|
63
|
+
name="model_name",
|
|
64
|
+
display_name="Model Name",
|
|
65
|
+
info="The embedding model to use for the selected provider. Each provider has a different set of models "
|
|
66
|
+
f"available (full list at https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html):\n\n{VECTORIZE_MODELS_STR}",
|
|
67
|
+
required=True,
|
|
68
|
+
),
|
|
69
|
+
MessageTextInput(
|
|
70
|
+
name="api_key_name",
|
|
71
|
+
display_name="API Key name",
|
|
72
|
+
info="The name of the embeddings provider API key stored on Astra. "
|
|
73
|
+
"If set, it will override the 'ProviderKey' in the authentication parameters.",
|
|
74
|
+
),
|
|
75
|
+
DictInput(
|
|
76
|
+
name="authentication",
|
|
77
|
+
display_name="Authentication parameters",
|
|
78
|
+
is_list=True,
|
|
79
|
+
advanced=True,
|
|
80
|
+
),
|
|
81
|
+
SecretStrInput(
|
|
82
|
+
name="provider_api_key",
|
|
83
|
+
display_name="Provider API Key",
|
|
84
|
+
info="An alternative to the Astra Authentication that passes an API key for the provider with each request "
|
|
85
|
+
"to Astra DB. "
|
|
86
|
+
"This may be used when Vectorize is configured for the collection, "
|
|
87
|
+
"but no corresponding provider secret is stored within Astra's key management system.",
|
|
88
|
+
advanced=True,
|
|
89
|
+
),
|
|
90
|
+
DictInput(
|
|
91
|
+
name="authentication",
|
|
92
|
+
display_name="Authentication Parameters",
|
|
93
|
+
is_list=True,
|
|
94
|
+
advanced=True,
|
|
95
|
+
),
|
|
96
|
+
DictInput(
|
|
97
|
+
name="model_parameters",
|
|
98
|
+
display_name="Model Parameters",
|
|
99
|
+
advanced=True,
|
|
100
|
+
is_list=True,
|
|
101
|
+
),
|
|
102
|
+
]
|
|
103
|
+
outputs = [
|
|
104
|
+
Output(display_name="Vectorize", name="config", method="build_options", types=["dict"]),
|
|
105
|
+
]
|
|
106
|
+
|
|
107
|
+
def build_options(self) -> dict[str, Any]:
|
|
108
|
+
provider_value = self.VECTORIZE_PROVIDERS_MAPPING[self.provider][0]
|
|
109
|
+
authentication = {**(self.authentication or {})}
|
|
110
|
+
api_key_name = self.api_key_name
|
|
111
|
+
if api_key_name:
|
|
112
|
+
authentication["providerKey"] = api_key_name
|
|
113
|
+
return {
|
|
114
|
+
# must match astrapy.info.VectorServiceOptions
|
|
115
|
+
"collection_vector_service_options": {
|
|
116
|
+
"provider": provider_value,
|
|
117
|
+
"modelName": self.model_name,
|
|
118
|
+
"authentication": authentication,
|
|
119
|
+
"parameters": self.model_parameters or {},
|
|
120
|
+
},
|
|
121
|
+
"collection_embedding_api_key": self.provider_api_key,
|
|
122
|
+
}
|
|
@@ -0,0 +1,449 @@
|
|
|
1
|
+
from astrapy import DataAPIClient
|
|
2
|
+
from langchain_core.documents import Document
|
|
3
|
+
|
|
4
|
+
from lfx.base.datastax.astradb_base import AstraDBBaseComponent
|
|
5
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
|
6
|
+
from lfx.base.vectorstores.vector_store_connection_decorator import vector_store_connection
|
|
7
|
+
from lfx.helpers.data import docs_to_data
|
|
8
|
+
from lfx.io import BoolInput, DropdownInput, FloatInput, HandleInput, IntInput, NestedDictInput, QueryInput, StrInput
|
|
9
|
+
from lfx.schema.data import Data
|
|
10
|
+
from lfx.serialization import serialize
|
|
11
|
+
from lfx.utils.version import get_version_info
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@vector_store_connection
|
|
15
|
+
class AstraDBVectorStoreComponent(AstraDBBaseComponent, LCVectorStoreComponent):
|
|
16
|
+
display_name: str = "Astra DB"
|
|
17
|
+
description: str = "Ingest and search documents in Astra DB"
|
|
18
|
+
documentation: str = "https://docs.langflow.org/bundles-datastax"
|
|
19
|
+
name = "AstraDB"
|
|
20
|
+
icon: str = "AstraDB"
|
|
21
|
+
|
|
22
|
+
inputs = [
|
|
23
|
+
*AstraDBBaseComponent.inputs,
|
|
24
|
+
*LCVectorStoreComponent.inputs,
|
|
25
|
+
HandleInput(
|
|
26
|
+
name="embedding_model",
|
|
27
|
+
display_name="Embedding Model",
|
|
28
|
+
input_types=["Embeddings"],
|
|
29
|
+
info="Specify the Embedding Model. Not required for Astra Vectorize collections.",
|
|
30
|
+
required=False,
|
|
31
|
+
show=True,
|
|
32
|
+
),
|
|
33
|
+
StrInput(
|
|
34
|
+
name="content_field",
|
|
35
|
+
display_name="Content Field",
|
|
36
|
+
info="Field to use as the text content field for the vector store.",
|
|
37
|
+
advanced=True,
|
|
38
|
+
),
|
|
39
|
+
StrInput(
|
|
40
|
+
name="deletion_field",
|
|
41
|
+
display_name="Deletion Based On Field",
|
|
42
|
+
info="When this parameter is provided, documents in the target collection with "
|
|
43
|
+
"metadata field values matching the input metadata field value will be deleted "
|
|
44
|
+
"before new data is loaded.",
|
|
45
|
+
advanced=True,
|
|
46
|
+
),
|
|
47
|
+
BoolInput(
|
|
48
|
+
name="ignore_invalid_documents",
|
|
49
|
+
display_name="Ignore Invalid Documents",
|
|
50
|
+
info="Boolean flag to determine whether to ignore invalid documents at runtime.",
|
|
51
|
+
advanced=True,
|
|
52
|
+
),
|
|
53
|
+
NestedDictInput(
|
|
54
|
+
name="astradb_vectorstore_kwargs",
|
|
55
|
+
display_name="AstraDBVectorStore Parameters",
|
|
56
|
+
info="Optional dictionary of additional parameters for the AstraDBVectorStore.",
|
|
57
|
+
advanced=True,
|
|
58
|
+
),
|
|
59
|
+
DropdownInput(
|
|
60
|
+
name="search_method",
|
|
61
|
+
display_name="Search Method",
|
|
62
|
+
info=(
|
|
63
|
+
"Determine how your content is matched: Vector finds semantic similarity, "
|
|
64
|
+
"and Hybrid Search (suggested) combines both approaches "
|
|
65
|
+
"with a reranker."
|
|
66
|
+
),
|
|
67
|
+
options=["Hybrid Search", "Vector Search"], # TODO: Restore Lexical Search?
|
|
68
|
+
options_metadata=[{"icon": "SearchHybrid"}, {"icon": "SearchVector"}],
|
|
69
|
+
value="Vector Search",
|
|
70
|
+
advanced=True,
|
|
71
|
+
real_time_refresh=True,
|
|
72
|
+
),
|
|
73
|
+
DropdownInput(
|
|
74
|
+
name="reranker",
|
|
75
|
+
display_name="Reranker",
|
|
76
|
+
info="Post-retrieval model that re-scores results for optimal relevance ranking.",
|
|
77
|
+
show=False,
|
|
78
|
+
toggle=True,
|
|
79
|
+
),
|
|
80
|
+
QueryInput(
|
|
81
|
+
name="lexical_terms",
|
|
82
|
+
display_name="Lexical Terms",
|
|
83
|
+
info="Add additional terms/keywords to augment search precision.",
|
|
84
|
+
placeholder="Enter terms to search...",
|
|
85
|
+
separator=" ",
|
|
86
|
+
show=False,
|
|
87
|
+
value="",
|
|
88
|
+
),
|
|
89
|
+
IntInput(
|
|
90
|
+
name="number_of_results",
|
|
91
|
+
display_name="Number of Search Results",
|
|
92
|
+
info="Number of search results to return.",
|
|
93
|
+
advanced=True,
|
|
94
|
+
value=4,
|
|
95
|
+
),
|
|
96
|
+
DropdownInput(
|
|
97
|
+
name="search_type",
|
|
98
|
+
display_name="Search Type",
|
|
99
|
+
info="Search type to use",
|
|
100
|
+
options=["Similarity", "Similarity with score threshold", "MMR (Max Marginal Relevance)"],
|
|
101
|
+
value="Similarity",
|
|
102
|
+
advanced=True,
|
|
103
|
+
),
|
|
104
|
+
FloatInput(
|
|
105
|
+
name="search_score_threshold",
|
|
106
|
+
display_name="Search Score Threshold",
|
|
107
|
+
info="Minimum similarity score threshold for search results. "
|
|
108
|
+
"(when using 'Similarity with score threshold')",
|
|
109
|
+
value=0,
|
|
110
|
+
advanced=True,
|
|
111
|
+
),
|
|
112
|
+
NestedDictInput(
|
|
113
|
+
name="advanced_search_filter",
|
|
114
|
+
display_name="Search Metadata Filter",
|
|
115
|
+
info="Optional dictionary of filters to apply to the search query.",
|
|
116
|
+
advanced=True,
|
|
117
|
+
),
|
|
118
|
+
]
|
|
119
|
+
|
|
120
|
+
async def update_build_config(
|
|
121
|
+
self,
|
|
122
|
+
build_config: dict,
|
|
123
|
+
field_value: str | dict,
|
|
124
|
+
field_name: str | None = None,
|
|
125
|
+
) -> dict:
|
|
126
|
+
"""Update build configuration with proper handling of embedding and search options."""
|
|
127
|
+
# Handle base astra db build config updates
|
|
128
|
+
build_config = await super().update_build_config(
|
|
129
|
+
build_config,
|
|
130
|
+
field_value=field_value,
|
|
131
|
+
field_name=field_name,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# Set embedding model display based on provider selection
|
|
135
|
+
if isinstance(field_value, dict) and "02_embedding_generation_provider" in field_value:
|
|
136
|
+
embedding_provider = field_value.get("02_embedding_generation_provider")
|
|
137
|
+
is_custom_provider = embedding_provider and embedding_provider != "Bring your own"
|
|
138
|
+
provider = embedding_provider.lower() if is_custom_provider and embedding_provider is not None else None
|
|
139
|
+
|
|
140
|
+
build_config["embedding_model"]["show"] = not bool(provider)
|
|
141
|
+
build_config["embedding_model"]["required"] = not bool(provider)
|
|
142
|
+
|
|
143
|
+
# Early return if no API endpoint is configured
|
|
144
|
+
if not self.get_api_endpoint():
|
|
145
|
+
return build_config
|
|
146
|
+
|
|
147
|
+
# Configure search method and related options
|
|
148
|
+
return self._configure_search_options(build_config)
|
|
149
|
+
|
|
150
|
+
def _configure_search_options(self, build_config: dict) -> dict:
|
|
151
|
+
"""Configure hybrid search, reranker, and vector search options."""
|
|
152
|
+
# Detect available hybrid search capabilities
|
|
153
|
+
hybrid_capabilities = self._detect_hybrid_capabilities()
|
|
154
|
+
|
|
155
|
+
# Return if we haven't selected a collection
|
|
156
|
+
if not build_config["collection_name"]["options"] or not build_config["collection_name"]["value"]:
|
|
157
|
+
return build_config
|
|
158
|
+
|
|
159
|
+
# Get collection options
|
|
160
|
+
collection_options = self._get_collection_options(build_config)
|
|
161
|
+
|
|
162
|
+
# Get the selected collection index
|
|
163
|
+
index = build_config["collection_name"]["options"].index(build_config["collection_name"]["value"])
|
|
164
|
+
provider = build_config["collection_name"]["options_metadata"][index]["provider"]
|
|
165
|
+
build_config["embedding_model"]["show"] = not bool(provider)
|
|
166
|
+
build_config["embedding_model"]["required"] = not bool(provider)
|
|
167
|
+
|
|
168
|
+
# Determine search configuration
|
|
169
|
+
is_vector_search = build_config["search_method"]["value"] == "Vector Search"
|
|
170
|
+
is_autodetect = build_config["autodetect_collection"]["value"]
|
|
171
|
+
|
|
172
|
+
# Apply hybrid search configuration
|
|
173
|
+
if hybrid_capabilities["available"]:
|
|
174
|
+
build_config["search_method"]["show"] = True
|
|
175
|
+
build_config["search_method"]["options"] = ["Hybrid Search", "Vector Search"]
|
|
176
|
+
build_config["search_method"]["value"] = build_config["search_method"].get("value", "Hybrid Search")
|
|
177
|
+
|
|
178
|
+
build_config["reranker"]["options"] = hybrid_capabilities["reranker_models"]
|
|
179
|
+
build_config["reranker"]["options_metadata"] = hybrid_capabilities["reranker_metadata"]
|
|
180
|
+
if hybrid_capabilities["reranker_models"]:
|
|
181
|
+
build_config["reranker"]["value"] = hybrid_capabilities["reranker_models"][0]
|
|
182
|
+
else:
|
|
183
|
+
build_config["search_method"]["show"] = False
|
|
184
|
+
build_config["search_method"]["options"] = ["Vector Search"]
|
|
185
|
+
build_config["search_method"]["value"] = "Vector Search"
|
|
186
|
+
build_config["reranker"]["options"] = []
|
|
187
|
+
build_config["reranker"]["options_metadata"] = []
|
|
188
|
+
|
|
189
|
+
# Configure reranker visibility and state
|
|
190
|
+
hybrid_enabled = (
|
|
191
|
+
collection_options["rerank_enabled"] and build_config["search_method"]["value"] == "Hybrid Search"
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
build_config["reranker"]["show"] = hybrid_enabled
|
|
195
|
+
build_config["reranker"]["toggle_value"] = hybrid_enabled
|
|
196
|
+
build_config["reranker"]["toggle_disable"] = is_vector_search
|
|
197
|
+
|
|
198
|
+
# Configure lexical terms
|
|
199
|
+
lexical_visible = collection_options["lexical_enabled"] and not is_vector_search
|
|
200
|
+
build_config["lexical_terms"]["show"] = lexical_visible
|
|
201
|
+
build_config["lexical_terms"]["value"] = "" if is_vector_search else build_config["lexical_terms"]["value"]
|
|
202
|
+
|
|
203
|
+
# Configure search type and score threshold
|
|
204
|
+
build_config["search_type"]["show"] = is_vector_search
|
|
205
|
+
build_config["search_score_threshold"]["show"] = is_vector_search
|
|
206
|
+
|
|
207
|
+
# Force similarity search for hybrid mode or autodetect
|
|
208
|
+
if hybrid_enabled or is_autodetect:
|
|
209
|
+
build_config["search_type"]["value"] = "Similarity"
|
|
210
|
+
|
|
211
|
+
return build_config
|
|
212
|
+
|
|
213
|
+
def _detect_hybrid_capabilities(self) -> dict:
|
|
214
|
+
"""Detect available hybrid search and reranking capabilities."""
|
|
215
|
+
environment = self.get_environment(self.environment)
|
|
216
|
+
client = DataAPIClient(environment=environment)
|
|
217
|
+
admin_client = client.get_admin()
|
|
218
|
+
db_admin = admin_client.get_database_admin(self.get_api_endpoint(), token=self.token)
|
|
219
|
+
|
|
220
|
+
try:
|
|
221
|
+
providers = db_admin.find_reranking_providers()
|
|
222
|
+
reranker_models = [
|
|
223
|
+
model.name for provider_data in providers.reranking_providers.values() for model in provider_data.models
|
|
224
|
+
]
|
|
225
|
+
reranker_metadata = [
|
|
226
|
+
{"icon": self.get_provider_icon(provider_name=model.name.split("/")[0])}
|
|
227
|
+
for provider in providers.reranking_providers.values()
|
|
228
|
+
for model in provider.models
|
|
229
|
+
]
|
|
230
|
+
except Exception as e: # noqa: BLE001
|
|
231
|
+
self.log(f"Hybrid search not available: {e}")
|
|
232
|
+
return {
|
|
233
|
+
"available": False,
|
|
234
|
+
"reranker_models": [],
|
|
235
|
+
"reranker_metadata": [],
|
|
236
|
+
}
|
|
237
|
+
else:
|
|
238
|
+
return {
|
|
239
|
+
"available": True,
|
|
240
|
+
"reranker_models": reranker_models,
|
|
241
|
+
"reranker_metadata": reranker_metadata,
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
def _get_collection_options(self, build_config: dict) -> dict:
|
|
245
|
+
"""Retrieve collection-level search options."""
|
|
246
|
+
database = self.get_database_object(api_endpoint=build_config["api_endpoint"]["value"])
|
|
247
|
+
collection = database.get_collection(
|
|
248
|
+
name=build_config["collection_name"]["value"],
|
|
249
|
+
keyspace=build_config["keyspace"]["value"],
|
|
250
|
+
)
|
|
251
|
+
|
|
252
|
+
col_options = collection.options()
|
|
253
|
+
|
|
254
|
+
return {
|
|
255
|
+
"rerank_enabled": bool(col_options.rerank and col_options.rerank.enabled),
|
|
256
|
+
"lexical_enabled": bool(col_options.lexical and col_options.lexical.enabled),
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
@check_cached_vector_store
|
|
260
|
+
def build_vector_store(self):
|
|
261
|
+
try:
|
|
262
|
+
from langchain_astradb import AstraDBVectorStore
|
|
263
|
+
from langchain_astradb.utils.astradb import HybridSearchMode
|
|
264
|
+
except ImportError as e:
|
|
265
|
+
msg = (
|
|
266
|
+
"Could not import langchain Astra DB integration package. "
|
|
267
|
+
"Please install it with `pip install langchain-astradb`."
|
|
268
|
+
)
|
|
269
|
+
raise ImportError(msg) from e
|
|
270
|
+
|
|
271
|
+
# Get the embedding model and additional params
|
|
272
|
+
embedding_params = {"embedding": self.embedding_model} if self.embedding_model else {}
|
|
273
|
+
|
|
274
|
+
# Get the additional parameters
|
|
275
|
+
additional_params = self.astradb_vectorstore_kwargs or {}
|
|
276
|
+
|
|
277
|
+
# Get Langflow version and platform information
|
|
278
|
+
__version__ = get_version_info()["version"]
|
|
279
|
+
langflow_prefix = ""
|
|
280
|
+
# if os.getenv("AWS_EXECUTION_ENV") == "AWS_ECS_FARGATE": # TODO: More precise way of detecting
|
|
281
|
+
# langflow_prefix = "ds-"
|
|
282
|
+
|
|
283
|
+
# Get the database object
|
|
284
|
+
database = self.get_database_object()
|
|
285
|
+
autodetect = self.collection_name in database.list_collection_names() and self.autodetect_collection
|
|
286
|
+
|
|
287
|
+
# Bundle up the auto-detect parameters
|
|
288
|
+
autodetect_params = {
|
|
289
|
+
"autodetect_collection": autodetect,
|
|
290
|
+
"content_field": (
|
|
291
|
+
self.content_field
|
|
292
|
+
if self.content_field and embedding_params
|
|
293
|
+
else (
|
|
294
|
+
"page_content"
|
|
295
|
+
if embedding_params
|
|
296
|
+
and self.collection_data(collection_name=self.collection_name, database=database) == 0
|
|
297
|
+
else None
|
|
298
|
+
)
|
|
299
|
+
),
|
|
300
|
+
"ignore_invalid_documents": self.ignore_invalid_documents,
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
# Choose HybridSearchMode based on the selected param
|
|
304
|
+
hybrid_search_mode = HybridSearchMode.DEFAULT if self.search_method == "Hybrid Search" else HybridSearchMode.OFF
|
|
305
|
+
|
|
306
|
+
# Attempt to build the Vector Store object
|
|
307
|
+
try:
|
|
308
|
+
vector_store = AstraDBVectorStore(
|
|
309
|
+
# Astra DB Authentication Parameters
|
|
310
|
+
token=self.token,
|
|
311
|
+
api_endpoint=database.api_endpoint,
|
|
312
|
+
namespace=database.keyspace,
|
|
313
|
+
collection_name=self.collection_name,
|
|
314
|
+
environment=self.environment,
|
|
315
|
+
# Hybrid Search Parameters
|
|
316
|
+
hybrid_search=hybrid_search_mode,
|
|
317
|
+
# Astra DB Usage Tracking Parameters
|
|
318
|
+
ext_callers=[(f"{langflow_prefix}langflow", __version__)],
|
|
319
|
+
# Astra DB Vector Store Parameters
|
|
320
|
+
**autodetect_params,
|
|
321
|
+
**embedding_params,
|
|
322
|
+
**additional_params,
|
|
323
|
+
)
|
|
324
|
+
except ValueError as e:
|
|
325
|
+
msg = f"Error initializing AstraDBVectorStore: {e}"
|
|
326
|
+
raise ValueError(msg) from e
|
|
327
|
+
|
|
328
|
+
# Add documents to the vector store
|
|
329
|
+
self._add_documents_to_vector_store(vector_store)
|
|
330
|
+
|
|
331
|
+
return vector_store
|
|
332
|
+
|
|
333
|
+
def _add_documents_to_vector_store(self, vector_store) -> None:
|
|
334
|
+
self.ingest_data = self._prepare_ingest_data()
|
|
335
|
+
|
|
336
|
+
documents = []
|
|
337
|
+
for _input in self.ingest_data or []:
|
|
338
|
+
if isinstance(_input, Data):
|
|
339
|
+
documents.append(_input.to_lc_document())
|
|
340
|
+
else:
|
|
341
|
+
msg = "Vector Store Inputs must be Data objects."
|
|
342
|
+
raise TypeError(msg)
|
|
343
|
+
|
|
344
|
+
documents = [
|
|
345
|
+
Document(page_content=doc.page_content, metadata=serialize(doc.metadata, to_str=True)) for doc in documents
|
|
346
|
+
]
|
|
347
|
+
|
|
348
|
+
if documents and self.deletion_field:
|
|
349
|
+
self.log(f"Deleting documents where {self.deletion_field}")
|
|
350
|
+
try:
|
|
351
|
+
database = self.get_database_object()
|
|
352
|
+
collection = database.get_collection(self.collection_name, keyspace=database.keyspace)
|
|
353
|
+
delete_values = list({doc.metadata[self.deletion_field] for doc in documents})
|
|
354
|
+
self.log(f"Deleting documents where {self.deletion_field} matches {delete_values}.")
|
|
355
|
+
collection.delete_many({f"metadata.{self.deletion_field}": {"$in": delete_values}})
|
|
356
|
+
except ValueError as e:
|
|
357
|
+
msg = f"Error deleting documents from AstraDBVectorStore based on '{self.deletion_field}': {e}"
|
|
358
|
+
raise ValueError(msg) from e
|
|
359
|
+
|
|
360
|
+
if documents:
|
|
361
|
+
self.log(f"Adding {len(documents)} documents to the Vector Store.")
|
|
362
|
+
try:
|
|
363
|
+
vector_store.add_documents(documents)
|
|
364
|
+
except ValueError as e:
|
|
365
|
+
msg = f"Error adding documents to AstraDBVectorStore: {e}"
|
|
366
|
+
raise ValueError(msg) from e
|
|
367
|
+
else:
|
|
368
|
+
self.log("No documents to add to the Vector Store.")
|
|
369
|
+
|
|
370
|
+
def _map_search_type(self) -> str:
|
|
371
|
+
search_type_mapping = {
|
|
372
|
+
"Similarity with score threshold": "similarity_score_threshold",
|
|
373
|
+
"MMR (Max Marginal Relevance)": "mmr",
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
return search_type_mapping.get(self.search_type, "similarity")
|
|
377
|
+
|
|
378
|
+
def _build_search_args(self):
|
|
379
|
+
# Clean up the search query
|
|
380
|
+
query = self.search_query if isinstance(self.search_query, str) and self.search_query.strip() else None
|
|
381
|
+
lexical_terms = self.lexical_terms or None
|
|
382
|
+
|
|
383
|
+
# Check if we have a search query, and if so set the args
|
|
384
|
+
if query:
|
|
385
|
+
args = {
|
|
386
|
+
"query": query,
|
|
387
|
+
"search_type": self._map_search_type(),
|
|
388
|
+
"k": self.number_of_results,
|
|
389
|
+
"score_threshold": self.search_score_threshold,
|
|
390
|
+
"lexical_query": lexical_terms,
|
|
391
|
+
}
|
|
392
|
+
elif self.advanced_search_filter:
|
|
393
|
+
args = {
|
|
394
|
+
"n": self.number_of_results,
|
|
395
|
+
}
|
|
396
|
+
else:
|
|
397
|
+
return {}
|
|
398
|
+
|
|
399
|
+
filter_arg = self.advanced_search_filter or {}
|
|
400
|
+
if filter_arg:
|
|
401
|
+
args["filter"] = filter_arg
|
|
402
|
+
|
|
403
|
+
return args
|
|
404
|
+
|
|
405
|
+
def search_documents(self, vector_store=None) -> list[Data]:
|
|
406
|
+
vector_store = vector_store or self.build_vector_store()
|
|
407
|
+
|
|
408
|
+
self.log(f"Search input: {self.search_query}")
|
|
409
|
+
self.log(f"Search type: {self.search_type}")
|
|
410
|
+
self.log(f"Number of results: {self.number_of_results}")
|
|
411
|
+
self.log(f"store.hybrid_search: {vector_store.hybrid_search}")
|
|
412
|
+
self.log(f"Lexical terms: {self.lexical_terms}")
|
|
413
|
+
self.log(f"Reranker: {self.reranker}")
|
|
414
|
+
|
|
415
|
+
try:
|
|
416
|
+
search_args = self._build_search_args()
|
|
417
|
+
except ValueError as e:
|
|
418
|
+
msg = f"Error in AstraDBVectorStore._build_search_args: {e}"
|
|
419
|
+
raise ValueError(msg) from e
|
|
420
|
+
|
|
421
|
+
if not search_args:
|
|
422
|
+
self.log("No search input or filters provided. Skipping search.")
|
|
423
|
+
return []
|
|
424
|
+
|
|
425
|
+
docs = []
|
|
426
|
+
search_method = "search" if "query" in search_args else "metadata_search"
|
|
427
|
+
|
|
428
|
+
try:
|
|
429
|
+
self.log(f"Calling vector_store.{search_method} with args: {search_args}")
|
|
430
|
+
docs = getattr(vector_store, search_method)(**search_args)
|
|
431
|
+
except ValueError as e:
|
|
432
|
+
msg = f"Error performing {search_method} in AstraDBVectorStore: {e}"
|
|
433
|
+
raise ValueError(msg) from e
|
|
434
|
+
|
|
435
|
+
self.log(f"Retrieved documents: {len(docs)}")
|
|
436
|
+
|
|
437
|
+
data = docs_to_data(docs)
|
|
438
|
+
self.log(f"Converted documents to data: {len(data)}")
|
|
439
|
+
self.status = data
|
|
440
|
+
|
|
441
|
+
return data
|
|
442
|
+
|
|
443
|
+
def get_retriever_kwargs(self):
|
|
444
|
+
search_args = self._build_search_args()
|
|
445
|
+
|
|
446
|
+
return {
|
|
447
|
+
"search_type": self._map_search_type(),
|
|
448
|
+
"search_kwargs": search_args,
|
|
449
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
from lfx.base.astra_assistants.util import get_patched_openai_client
|
|
2
|
+
from lfx.custom.custom_component.component_with_cache import ComponentWithCache
|
|
3
|
+
from lfx.inputs.inputs import MultilineInput, StrInput
|
|
4
|
+
from lfx.log.logger import logger
|
|
5
|
+
from lfx.schema.message import Message
|
|
6
|
+
from lfx.template.field.base import Output
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class AssistantsCreateAssistant(ComponentWithCache):
|
|
10
|
+
icon = "AstraDB"
|
|
11
|
+
display_name = "Create Assistant"
|
|
12
|
+
description = "Creates an Assistant and returns it's id"
|
|
13
|
+
legacy = True
|
|
14
|
+
|
|
15
|
+
inputs = [
|
|
16
|
+
StrInput(
|
|
17
|
+
name="assistant_name",
|
|
18
|
+
display_name="Assistant Name",
|
|
19
|
+
info="Name for the assistant being created",
|
|
20
|
+
),
|
|
21
|
+
StrInput(
|
|
22
|
+
name="instructions",
|
|
23
|
+
display_name="Instructions",
|
|
24
|
+
info="Instructions for the assistant, think of these as the system prompt.",
|
|
25
|
+
),
|
|
26
|
+
StrInput(
|
|
27
|
+
name="model",
|
|
28
|
+
display_name="Model name",
|
|
29
|
+
info=(
|
|
30
|
+
"Model for the assistant.\n\n"
|
|
31
|
+
"Environment variables for provider credentials can be set with the Dotenv Component.\n\n"
|
|
32
|
+
"Models are supported via LiteLLM, "
|
|
33
|
+
"see (https://docs.litellm.ai/docs/providers) for supported model names and env vars."
|
|
34
|
+
),
|
|
35
|
+
# refresh_model=True
|
|
36
|
+
),
|
|
37
|
+
MultilineInput(
|
|
38
|
+
name="env_set",
|
|
39
|
+
display_name="Environment Set",
|
|
40
|
+
info="Dummy input to allow chaining with Dotenv Component.",
|
|
41
|
+
),
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
outputs = [
|
|
45
|
+
Output(display_name="Assistant ID", name="assistant_id", method="process_inputs"),
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
def __init__(self, **kwargs) -> None:
|
|
49
|
+
super().__init__(**kwargs)
|
|
50
|
+
self.client = get_patched_openai_client(self._shared_component_cache)
|
|
51
|
+
|
|
52
|
+
def process_inputs(self) -> Message:
|
|
53
|
+
logger.info(f"env_set is {self.env_set}")
|
|
54
|
+
assistant = self.client.beta.assistants.create(
|
|
55
|
+
name=self.assistant_name,
|
|
56
|
+
instructions=self.instructions,
|
|
57
|
+
model=self.model,
|
|
58
|
+
)
|
|
59
|
+
return Message(text=assistant.id)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from lfx.base.astra_assistants.util import get_patched_openai_client
|
|
2
|
+
from lfx.custom.custom_component.component_with_cache import ComponentWithCache
|
|
3
|
+
from lfx.inputs.inputs import MultilineInput
|
|
4
|
+
from lfx.schema.message import Message
|
|
5
|
+
from lfx.template.field.base import Output
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class AssistantsCreateThread(ComponentWithCache):
|
|
9
|
+
display_name = "Create Assistant Thread"
|
|
10
|
+
description = "Creates a thread and returns the thread id"
|
|
11
|
+
icon = "AstraDB"
|
|
12
|
+
legacy = True
|
|
13
|
+
inputs = [
|
|
14
|
+
MultilineInput(
|
|
15
|
+
name="env_set",
|
|
16
|
+
display_name="Environment Set",
|
|
17
|
+
info="Dummy input to allow chaining with Dotenv Component.",
|
|
18
|
+
),
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
outputs = [
|
|
22
|
+
Output(display_name="Thread ID", name="thread_id", method="process_inputs"),
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
def __init__(self, **kwargs) -> None:
|
|
26
|
+
super().__init__(**kwargs)
|
|
27
|
+
self.client = get_patched_openai_client(self._shared_component_cache)
|
|
28
|
+
|
|
29
|
+
def process_inputs(self) -> Message:
|
|
30
|
+
thread = self.client.beta.threads.create()
|
|
31
|
+
thread_id = thread.id
|
|
32
|
+
|
|
33
|
+
return Message(text=thread_id)
|