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,141 @@
|
|
|
1
|
+
from langchain_text_splitters import CharacterTextSplitter
|
|
2
|
+
|
|
3
|
+
from lfx.custom.custom_component.component import Component
|
|
4
|
+
from lfx.io import DropdownInput, HandleInput, IntInput, MessageTextInput, Output
|
|
5
|
+
from lfx.schema.data import Data
|
|
6
|
+
from lfx.schema.dataframe import DataFrame
|
|
7
|
+
from lfx.schema.message import Message
|
|
8
|
+
from lfx.utils.util import unescape_string
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SplitTextComponent(Component):
|
|
12
|
+
display_name: str = "Split Text"
|
|
13
|
+
description: str = "Split text into chunks based on specified criteria."
|
|
14
|
+
documentation: str = "https://docs.langflow.org/split-text"
|
|
15
|
+
icon = "scissors-line-dashed"
|
|
16
|
+
name = "SplitText"
|
|
17
|
+
|
|
18
|
+
inputs = [
|
|
19
|
+
HandleInput(
|
|
20
|
+
name="data_inputs",
|
|
21
|
+
display_name="Input",
|
|
22
|
+
info="The data with texts to split in chunks.",
|
|
23
|
+
input_types=["Data", "DataFrame", "Message"],
|
|
24
|
+
required=True,
|
|
25
|
+
),
|
|
26
|
+
IntInput(
|
|
27
|
+
name="chunk_overlap",
|
|
28
|
+
display_name="Chunk Overlap",
|
|
29
|
+
info="Number of characters to overlap between chunks.",
|
|
30
|
+
value=200,
|
|
31
|
+
),
|
|
32
|
+
IntInput(
|
|
33
|
+
name="chunk_size",
|
|
34
|
+
display_name="Chunk Size",
|
|
35
|
+
info=(
|
|
36
|
+
"The maximum length of each chunk. Text is first split by separator, "
|
|
37
|
+
"then chunks are merged up to this size. "
|
|
38
|
+
"Individual splits larger than this won't be further divided."
|
|
39
|
+
),
|
|
40
|
+
value=1000,
|
|
41
|
+
),
|
|
42
|
+
MessageTextInput(
|
|
43
|
+
name="separator",
|
|
44
|
+
display_name="Separator",
|
|
45
|
+
info=(
|
|
46
|
+
"The character to split on. Use \\n for newline. "
|
|
47
|
+
"Examples: \\n\\n for paragraphs, \\n for lines, . for sentences"
|
|
48
|
+
),
|
|
49
|
+
value="\n",
|
|
50
|
+
),
|
|
51
|
+
MessageTextInput(
|
|
52
|
+
name="text_key",
|
|
53
|
+
display_name="Text Key",
|
|
54
|
+
info="The key to use for the text column.",
|
|
55
|
+
value="text",
|
|
56
|
+
advanced=True,
|
|
57
|
+
),
|
|
58
|
+
DropdownInput(
|
|
59
|
+
name="keep_separator",
|
|
60
|
+
display_name="Keep Separator",
|
|
61
|
+
info="Whether to keep the separator in the output chunks and where to place it.",
|
|
62
|
+
options=["False", "True", "Start", "End"],
|
|
63
|
+
value="False",
|
|
64
|
+
advanced=True,
|
|
65
|
+
),
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
outputs = [
|
|
69
|
+
Output(display_name="Chunks", name="dataframe", method="split_text"),
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
def _docs_to_data(self, docs) -> list[Data]:
|
|
73
|
+
return [Data(text=doc.page_content, data=doc.metadata) for doc in docs]
|
|
74
|
+
|
|
75
|
+
def _fix_separator(self, separator: str) -> str:
|
|
76
|
+
"""Fix common separator issues and convert to proper format."""
|
|
77
|
+
if separator == "/n":
|
|
78
|
+
return "\n"
|
|
79
|
+
if separator == "/t":
|
|
80
|
+
return "\t"
|
|
81
|
+
return separator
|
|
82
|
+
|
|
83
|
+
def split_text_base(self):
|
|
84
|
+
separator = self._fix_separator(self.separator)
|
|
85
|
+
separator = unescape_string(separator)
|
|
86
|
+
|
|
87
|
+
if isinstance(self.data_inputs, DataFrame):
|
|
88
|
+
if not len(self.data_inputs):
|
|
89
|
+
msg = "DataFrame is empty"
|
|
90
|
+
raise TypeError(msg)
|
|
91
|
+
|
|
92
|
+
self.data_inputs.text_key = self.text_key
|
|
93
|
+
try:
|
|
94
|
+
documents = self.data_inputs.to_lc_documents()
|
|
95
|
+
except Exception as e:
|
|
96
|
+
msg = f"Error converting DataFrame to documents: {e}"
|
|
97
|
+
raise TypeError(msg) from e
|
|
98
|
+
elif isinstance(self.data_inputs, Message):
|
|
99
|
+
self.data_inputs = [self.data_inputs.to_data()]
|
|
100
|
+
return self.split_text_base()
|
|
101
|
+
else:
|
|
102
|
+
if not self.data_inputs:
|
|
103
|
+
msg = "No data inputs provided"
|
|
104
|
+
raise TypeError(msg)
|
|
105
|
+
|
|
106
|
+
documents = []
|
|
107
|
+
if isinstance(self.data_inputs, Data):
|
|
108
|
+
self.data_inputs.text_key = self.text_key
|
|
109
|
+
documents = [self.data_inputs.to_lc_document()]
|
|
110
|
+
else:
|
|
111
|
+
try:
|
|
112
|
+
documents = [input_.to_lc_document() for input_ in self.data_inputs if isinstance(input_, Data)]
|
|
113
|
+
if not documents:
|
|
114
|
+
msg = f"No valid Data inputs found in {type(self.data_inputs)}"
|
|
115
|
+
raise TypeError(msg)
|
|
116
|
+
except AttributeError as e:
|
|
117
|
+
msg = f"Invalid input type in collection: {e}"
|
|
118
|
+
raise TypeError(msg) from e
|
|
119
|
+
try:
|
|
120
|
+
# Convert string 'False'/'True' to boolean
|
|
121
|
+
keep_sep = self.keep_separator
|
|
122
|
+
if isinstance(keep_sep, str):
|
|
123
|
+
if keep_sep.lower() == "false":
|
|
124
|
+
keep_sep = False
|
|
125
|
+
elif keep_sep.lower() == "true":
|
|
126
|
+
keep_sep = True
|
|
127
|
+
# 'start' and 'end' are kept as strings
|
|
128
|
+
|
|
129
|
+
splitter = CharacterTextSplitter(
|
|
130
|
+
chunk_overlap=self.chunk_overlap,
|
|
131
|
+
chunk_size=self.chunk_size,
|
|
132
|
+
separator=separator,
|
|
133
|
+
keep_separator=keep_sep,
|
|
134
|
+
)
|
|
135
|
+
return splitter.split_documents(documents)
|
|
136
|
+
except Exception as e:
|
|
137
|
+
msg = f"Error splitting text: {e}"
|
|
138
|
+
raise TypeError(msg) from e
|
|
139
|
+
|
|
140
|
+
def split_text(self) -> DataFrame:
|
|
141
|
+
return DataFrame(self._docs_to_data(self.split_text_base()))
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
from lfx.inputs.inputs import (
|
|
3
|
+
HandleInput,
|
|
4
|
+
MessageTextInput,
|
|
5
|
+
)
|
|
6
|
+
from lfx.memory import aget_messages, astore_message
|
|
7
|
+
from lfx.schema.message import Message
|
|
8
|
+
from lfx.template.field.base import Output
|
|
9
|
+
from lfx.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_NAME_AI
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class MessageStoreComponent(Component):
|
|
13
|
+
display_name = "Message Store"
|
|
14
|
+
description = "Stores a chat message or text into Langflow tables or an external memory."
|
|
15
|
+
icon = "message-square-text"
|
|
16
|
+
name = "StoreMessage"
|
|
17
|
+
legacy = True
|
|
18
|
+
replacement = ["helpers.Memory"]
|
|
19
|
+
|
|
20
|
+
inputs = [
|
|
21
|
+
MessageTextInput(
|
|
22
|
+
name="message", display_name="Message", info="The chat message to be stored.", required=True, tool_mode=True
|
|
23
|
+
),
|
|
24
|
+
HandleInput(
|
|
25
|
+
name="memory",
|
|
26
|
+
display_name="External Memory",
|
|
27
|
+
input_types=["Memory"],
|
|
28
|
+
info="The external memory to store the message. If empty, it will use the Langflow tables.",
|
|
29
|
+
),
|
|
30
|
+
MessageTextInput(
|
|
31
|
+
name="sender",
|
|
32
|
+
display_name="Sender",
|
|
33
|
+
info="The sender of the message. Might be Machine or User. "
|
|
34
|
+
"If empty, the current sender parameter will be used.",
|
|
35
|
+
advanced=True,
|
|
36
|
+
),
|
|
37
|
+
MessageTextInput(
|
|
38
|
+
name="sender_name",
|
|
39
|
+
display_name="Sender Name",
|
|
40
|
+
info="The name of the sender. Might be AI or User. If empty, the current sender parameter will be used.",
|
|
41
|
+
advanced=True,
|
|
42
|
+
),
|
|
43
|
+
MessageTextInput(
|
|
44
|
+
name="session_id",
|
|
45
|
+
display_name="Session ID",
|
|
46
|
+
info="The session ID of the chat. If empty, the current session ID parameter will be used.",
|
|
47
|
+
value="",
|
|
48
|
+
advanced=True,
|
|
49
|
+
),
|
|
50
|
+
]
|
|
51
|
+
|
|
52
|
+
outputs = [
|
|
53
|
+
Output(display_name="Stored Messages", name="stored_messages", method="store_message", hidden=True),
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
async def store_message(self) -> Message:
|
|
57
|
+
message = Message(text=self.message) if isinstance(self.message, str) else self.message
|
|
58
|
+
|
|
59
|
+
message.session_id = self.session_id or message.session_id
|
|
60
|
+
message.sender = self.sender or message.sender or MESSAGE_SENDER_AI
|
|
61
|
+
message.sender_name = self.sender_name or message.sender_name or MESSAGE_SENDER_NAME_AI
|
|
62
|
+
|
|
63
|
+
stored_messages: list[Message] = []
|
|
64
|
+
|
|
65
|
+
if self.memory:
|
|
66
|
+
self.memory.session_id = message.session_id
|
|
67
|
+
lc_message = message.to_lc_message()
|
|
68
|
+
await self.memory.aadd_messages([lc_message])
|
|
69
|
+
|
|
70
|
+
stored_messages = await self.memory.aget_messages() or []
|
|
71
|
+
|
|
72
|
+
stored_messages = [Message.from_lc_message(m) for m in stored_messages] if stored_messages else []
|
|
73
|
+
|
|
74
|
+
if message.sender:
|
|
75
|
+
stored_messages = [m for m in stored_messages if m.sender == message.sender]
|
|
76
|
+
else:
|
|
77
|
+
await astore_message(message, flow_id=self.graph.flow_id)
|
|
78
|
+
stored_messages = (
|
|
79
|
+
await aget_messages(
|
|
80
|
+
session_id=message.session_id, sender_name=message.sender_name, sender=message.sender
|
|
81
|
+
)
|
|
82
|
+
or []
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
if not stored_messages:
|
|
86
|
+
msg = "No messages were stored. Please ensure that the session ID and sender are properly set."
|
|
87
|
+
raise ValueError(msg)
|
|
88
|
+
|
|
89
|
+
stored_message = stored_messages[0]
|
|
90
|
+
self.status = stored_message
|
|
91
|
+
return stored_message
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from lfx.custom.custom_component.component import Component
|
|
4
|
+
from lfx.field_typing.range_spec import RangeSpec
|
|
5
|
+
from lfx.inputs.inputs import (
|
|
6
|
+
BoolInput,
|
|
7
|
+
DataInput,
|
|
8
|
+
DictInput,
|
|
9
|
+
IntInput,
|
|
10
|
+
MessageTextInput,
|
|
11
|
+
)
|
|
12
|
+
from lfx.io import Output
|
|
13
|
+
from lfx.schema.data import Data
|
|
14
|
+
from lfx.schema.dotdict import dotdict
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class UpdateDataComponent(Component):
|
|
18
|
+
display_name: str = "Update Data"
|
|
19
|
+
description: str = "Dynamically update or append data with the specified fields."
|
|
20
|
+
name: str = "UpdateData"
|
|
21
|
+
MAX_FIELDS = 15 # Define a constant for maximum number of fields
|
|
22
|
+
icon = "FolderSync"
|
|
23
|
+
legacy = True
|
|
24
|
+
replacement = ["processing.DataOperations"]
|
|
25
|
+
|
|
26
|
+
inputs = [
|
|
27
|
+
DataInput(
|
|
28
|
+
name="old_data",
|
|
29
|
+
display_name="Data",
|
|
30
|
+
info="The record to update.",
|
|
31
|
+
is_list=True, # Changed to True to handle list of Data objects
|
|
32
|
+
required=True,
|
|
33
|
+
),
|
|
34
|
+
IntInput(
|
|
35
|
+
name="number_of_fields",
|
|
36
|
+
display_name="Number of Fields",
|
|
37
|
+
info="Number of fields to be added to the record.",
|
|
38
|
+
real_time_refresh=True,
|
|
39
|
+
value=0,
|
|
40
|
+
range_spec=RangeSpec(min=1, max=MAX_FIELDS, step=1, step_type="int"),
|
|
41
|
+
),
|
|
42
|
+
MessageTextInput(
|
|
43
|
+
name="text_key",
|
|
44
|
+
display_name="Text Key",
|
|
45
|
+
info="Key that identifies the field to be used as the text content.",
|
|
46
|
+
advanced=True,
|
|
47
|
+
),
|
|
48
|
+
BoolInput(
|
|
49
|
+
name="text_key_validator",
|
|
50
|
+
display_name="Text Key Validator",
|
|
51
|
+
advanced=True,
|
|
52
|
+
info="If enabled, checks if the given 'Text Key' is present in the given 'Data'.",
|
|
53
|
+
),
|
|
54
|
+
]
|
|
55
|
+
|
|
56
|
+
outputs = [
|
|
57
|
+
Output(display_name="Data", name="data", method="build_data"),
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
|
|
61
|
+
"""Update the build configuration when the number of fields changes.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
build_config (dotdict): The current build configuration.
|
|
65
|
+
field_value (Any): The new value for the field.
|
|
66
|
+
field_name (Optional[str]): The name of the field being updated.
|
|
67
|
+
"""
|
|
68
|
+
if field_name == "number_of_fields":
|
|
69
|
+
default_keys = {
|
|
70
|
+
"code",
|
|
71
|
+
"_type",
|
|
72
|
+
"number_of_fields",
|
|
73
|
+
"text_key",
|
|
74
|
+
"old_data",
|
|
75
|
+
"text_key_validator",
|
|
76
|
+
}
|
|
77
|
+
try:
|
|
78
|
+
field_value_int = int(field_value)
|
|
79
|
+
except ValueError:
|
|
80
|
+
return build_config
|
|
81
|
+
|
|
82
|
+
if field_value_int > self.MAX_FIELDS:
|
|
83
|
+
build_config["number_of_fields"]["value"] = self.MAX_FIELDS
|
|
84
|
+
msg = f"Number of fields cannot exceed {self.MAX_FIELDS}. Try using a Component to combine two Data."
|
|
85
|
+
raise ValueError(msg)
|
|
86
|
+
|
|
87
|
+
existing_fields = {}
|
|
88
|
+
# Back up the existing template fields
|
|
89
|
+
for key in list(build_config.keys()):
|
|
90
|
+
if key not in default_keys:
|
|
91
|
+
existing_fields[key] = build_config.pop(key)
|
|
92
|
+
|
|
93
|
+
for i in range(1, field_value_int + 1):
|
|
94
|
+
key = f"field_{i}_key"
|
|
95
|
+
if key in existing_fields:
|
|
96
|
+
field = existing_fields[key]
|
|
97
|
+
build_config[key] = field
|
|
98
|
+
else:
|
|
99
|
+
field = DictInput(
|
|
100
|
+
display_name=f"Field {i}",
|
|
101
|
+
name=key,
|
|
102
|
+
info=f"Key for field {i}.",
|
|
103
|
+
input_types=["Message", "Data"],
|
|
104
|
+
)
|
|
105
|
+
build_config[field.name] = field.to_dict()
|
|
106
|
+
|
|
107
|
+
build_config["number_of_fields"]["value"] = field_value_int
|
|
108
|
+
return build_config
|
|
109
|
+
|
|
110
|
+
async def build_data(self) -> Data | list[Data]:
|
|
111
|
+
"""Build the updated data by combining the old data with new fields."""
|
|
112
|
+
new_data = self.get_data()
|
|
113
|
+
if isinstance(self.old_data, list):
|
|
114
|
+
for data_item in self.old_data:
|
|
115
|
+
if not isinstance(data_item, Data):
|
|
116
|
+
continue # Skip invalid items
|
|
117
|
+
data_item.data.update(new_data)
|
|
118
|
+
if self.text_key:
|
|
119
|
+
data_item.text_key = self.text_key
|
|
120
|
+
self.validate_text_key(data_item)
|
|
121
|
+
self.status = self.old_data
|
|
122
|
+
return self.old_data # Returns List[Data]
|
|
123
|
+
if isinstance(self.old_data, Data):
|
|
124
|
+
self.old_data.data.update(new_data)
|
|
125
|
+
if self.text_key:
|
|
126
|
+
self.old_data.text_key = self.text_key
|
|
127
|
+
self.status = self.old_data
|
|
128
|
+
self.validate_text_key(self.old_data)
|
|
129
|
+
return self.old_data # Returns Data
|
|
130
|
+
msg = "old_data is not a Data object or list of Data objects."
|
|
131
|
+
raise ValueError(msg)
|
|
132
|
+
|
|
133
|
+
def get_data(self):
|
|
134
|
+
"""Function to get the Data from the attributes."""
|
|
135
|
+
data = {}
|
|
136
|
+
default_keys = {
|
|
137
|
+
"code",
|
|
138
|
+
"_type",
|
|
139
|
+
"number_of_fields",
|
|
140
|
+
"text_key",
|
|
141
|
+
"old_data",
|
|
142
|
+
"text_key_validator",
|
|
143
|
+
}
|
|
144
|
+
for attr_name, attr_value in self._attributes.items():
|
|
145
|
+
if attr_name in default_keys:
|
|
146
|
+
continue # Skip default attributes
|
|
147
|
+
if isinstance(attr_value, dict):
|
|
148
|
+
for key, value in attr_value.items():
|
|
149
|
+
data[key] = value.get_text() if isinstance(value, Data) else value
|
|
150
|
+
elif isinstance(attr_value, Data):
|
|
151
|
+
data[attr_name] = attr_value.get_text()
|
|
152
|
+
else:
|
|
153
|
+
data[attr_name] = attr_value
|
|
154
|
+
return data
|
|
155
|
+
|
|
156
|
+
def validate_text_key(self, data: Data) -> None:
|
|
157
|
+
"""This function validates that the Text Key is one of the keys in the Data."""
|
|
158
|
+
data_keys = data.data.keys()
|
|
159
|
+
if self.text_key and self.text_key not in data_keys:
|
|
160
|
+
msg = f"Text Key: '{self.text_key}' not found in the Data keys: {', '.join(data_keys)}"
|
|
161
|
+
raise ValueError(msg)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import Any
|
|
4
|
+
|
|
5
|
+
from lfx.components._importing import import_mod
|
|
6
|
+
|
|
7
|
+
# _dynamic_imports = {
|
|
8
|
+
# "KnowledgeIngestionComponent": "ingestion",
|
|
9
|
+
# "KnowledgeRetrievalComponent": "retrieval",
|
|
10
|
+
|
|
11
|
+
# }
|
|
12
|
+
_dynamic_imports = {
|
|
13
|
+
"PythonFunctionComponent": "python_function",
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
# __all__ = ["KnowledgeIngestionComponent", "KnowledgeRetrievalComponent"]
|
|
17
|
+
__all__ = ["PythonFunctionComponent"]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def __getattr__(attr_name: str) -> Any:
|
|
21
|
+
"""Lazily import input/output components on attribute access."""
|
|
22
|
+
if attr_name not in _dynamic_imports:
|
|
23
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
24
|
+
raise AttributeError(msg)
|
|
25
|
+
try:
|
|
26
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
27
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
28
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
29
|
+
raise AttributeError(msg) from e
|
|
30
|
+
globals()[attr_name] = result
|
|
31
|
+
return result
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def __dir__() -> list[str]:
|
|
35
|
+
return list(__all__)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from collections.abc import Callable
|
|
2
|
+
|
|
3
|
+
from lfx.custom.custom_component.component import Component
|
|
4
|
+
from lfx.custom.utils import get_function
|
|
5
|
+
from lfx.io import CodeInput, Output
|
|
6
|
+
from lfx.log.logger import logger
|
|
7
|
+
from lfx.schema.data import Data
|
|
8
|
+
from lfx.schema.dotdict import dotdict
|
|
9
|
+
from lfx.schema.message import Message
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class PythonFunctionComponent(Component):
|
|
13
|
+
display_name = "Python Function"
|
|
14
|
+
description = "Define and execute a Python function that returns a Data object or a Message."
|
|
15
|
+
icon = "Python"
|
|
16
|
+
name = "PythonFunction"
|
|
17
|
+
legacy = True
|
|
18
|
+
|
|
19
|
+
inputs = [
|
|
20
|
+
CodeInput(
|
|
21
|
+
name="function_code",
|
|
22
|
+
display_name="Function Code",
|
|
23
|
+
info="The code for the function.",
|
|
24
|
+
),
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
outputs = [
|
|
28
|
+
Output(
|
|
29
|
+
name="function_output",
|
|
30
|
+
display_name="Function Callable",
|
|
31
|
+
method="get_function_callable",
|
|
32
|
+
),
|
|
33
|
+
Output(
|
|
34
|
+
name="function_output_data",
|
|
35
|
+
display_name="Function Output (Data)",
|
|
36
|
+
method="execute_function_data",
|
|
37
|
+
),
|
|
38
|
+
Output(
|
|
39
|
+
name="function_output_str",
|
|
40
|
+
display_name="Function Output (Message)",
|
|
41
|
+
method="execute_function_message",
|
|
42
|
+
),
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
def get_function_callable(self) -> Callable:
|
|
46
|
+
function_code = self.function_code
|
|
47
|
+
self.status = function_code
|
|
48
|
+
return get_function(function_code)
|
|
49
|
+
|
|
50
|
+
def execute_function(self) -> list[dotdict | str] | dotdict | str:
|
|
51
|
+
function_code = self.function_code
|
|
52
|
+
|
|
53
|
+
if not function_code:
|
|
54
|
+
return "No function code provided."
|
|
55
|
+
|
|
56
|
+
try:
|
|
57
|
+
func = get_function(function_code)
|
|
58
|
+
return func()
|
|
59
|
+
except Exception as e: # noqa: BLE001
|
|
60
|
+
logger.debug("Error executing function", exc_info=True)
|
|
61
|
+
return f"Error executing function: {e}"
|
|
62
|
+
|
|
63
|
+
def execute_function_data(self) -> list[Data]:
|
|
64
|
+
results = self.execute_function()
|
|
65
|
+
results = results if isinstance(results, list) else [results]
|
|
66
|
+
return [(Data(text=x) if isinstance(x, str) else Data(**x)) for x in results]
|
|
67
|
+
|
|
68
|
+
def execute_function_message(self) -> Message:
|
|
69
|
+
results = self.execute_function()
|
|
70
|
+
results = results if isinstance(results, list) else [results]
|
|
71
|
+
results_list = [str(x) for x in results]
|
|
72
|
+
results_str = "\n".join(results_list)
|
|
73
|
+
return Message(text=results_str)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from lfx.components._importing import import_mod
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from .qdrant import QdrantVectorStoreComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"QdrantVectorStoreComponent": "qdrant",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"QdrantVectorStoreComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import Qdrant components on attribute access."""
|
|
21
|
+
if attr_name not in _dynamic_imports:
|
|
22
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
23
|
+
raise AttributeError(msg)
|
|
24
|
+
try:
|
|
25
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
26
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
27
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
28
|
+
raise AttributeError(msg) from e
|
|
29
|
+
globals()[attr_name] = result
|
|
30
|
+
return result
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def __dir__() -> list[str]:
|
|
34
|
+
return list(__all__)
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
from langchain_community.vectorstores import Qdrant
|
|
2
|
+
from langchain_core.embeddings import Embeddings
|
|
3
|
+
|
|
4
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
|
5
|
+
from lfx.helpers.data import docs_to_data
|
|
6
|
+
from lfx.io import (
|
|
7
|
+
DropdownInput,
|
|
8
|
+
HandleInput,
|
|
9
|
+
IntInput,
|
|
10
|
+
SecretStrInput,
|
|
11
|
+
StrInput,
|
|
12
|
+
)
|
|
13
|
+
from lfx.schema.data import Data
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class QdrantVectorStoreComponent(LCVectorStoreComponent):
|
|
17
|
+
display_name = "Qdrant"
|
|
18
|
+
description = "Qdrant Vector Store with search capabilities"
|
|
19
|
+
icon = "Qdrant"
|
|
20
|
+
|
|
21
|
+
inputs = [
|
|
22
|
+
StrInput(name="collection_name", display_name="Collection Name", required=True),
|
|
23
|
+
StrInput(name="host", display_name="Host", value="localhost", advanced=True),
|
|
24
|
+
IntInput(name="port", display_name="Port", value=6333, advanced=True),
|
|
25
|
+
IntInput(name="grpc_port", display_name="gRPC Port", value=6334, advanced=True),
|
|
26
|
+
SecretStrInput(name="api_key", display_name="Qdrant API Key", advanced=True),
|
|
27
|
+
StrInput(name="prefix", display_name="Prefix", advanced=True),
|
|
28
|
+
IntInput(name="timeout", display_name="Timeout", advanced=True),
|
|
29
|
+
StrInput(name="path", display_name="Path", advanced=True),
|
|
30
|
+
StrInput(name="url", display_name="URL", advanced=True),
|
|
31
|
+
DropdownInput(
|
|
32
|
+
name="distance_func",
|
|
33
|
+
display_name="Distance Function",
|
|
34
|
+
options=["Cosine", "Euclidean", "Dot Product"],
|
|
35
|
+
value="Cosine",
|
|
36
|
+
advanced=True,
|
|
37
|
+
),
|
|
38
|
+
StrInput(name="content_payload_key", display_name="Content Payload Key", value="page_content", advanced=True),
|
|
39
|
+
StrInput(name="metadata_payload_key", display_name="Metadata Payload Key", value="metadata", advanced=True),
|
|
40
|
+
*LCVectorStoreComponent.inputs,
|
|
41
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
|
42
|
+
IntInput(
|
|
43
|
+
name="number_of_results",
|
|
44
|
+
display_name="Number of Results",
|
|
45
|
+
info="Number of results to return.",
|
|
46
|
+
value=4,
|
|
47
|
+
advanced=True,
|
|
48
|
+
),
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
@check_cached_vector_store
|
|
52
|
+
def build_vector_store(self) -> Qdrant:
|
|
53
|
+
qdrant_kwargs = {
|
|
54
|
+
"collection_name": self.collection_name,
|
|
55
|
+
"content_payload_key": self.content_payload_key,
|
|
56
|
+
"metadata_payload_key": self.metadata_payload_key,
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
server_kwargs = {
|
|
60
|
+
"host": self.host or None,
|
|
61
|
+
"port": int(self.port), # Ensure port is an integer
|
|
62
|
+
"grpc_port": int(self.grpc_port), # Ensure grpc_port is an integer
|
|
63
|
+
"api_key": self.api_key,
|
|
64
|
+
"prefix": self.prefix,
|
|
65
|
+
# Ensure timeout is an integer
|
|
66
|
+
"timeout": int(self.timeout) if self.timeout else None,
|
|
67
|
+
"path": self.path or None,
|
|
68
|
+
"url": self.url or None,
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
server_kwargs = {k: v for k, v in server_kwargs.items() if v is not None}
|
|
72
|
+
|
|
73
|
+
# Convert DataFrame to Data if needed using parent's method
|
|
74
|
+
self.ingest_data = self._prepare_ingest_data()
|
|
75
|
+
|
|
76
|
+
documents = []
|
|
77
|
+
for _input in self.ingest_data or []:
|
|
78
|
+
if isinstance(_input, Data):
|
|
79
|
+
documents.append(_input.to_lc_document())
|
|
80
|
+
else:
|
|
81
|
+
documents.append(_input)
|
|
82
|
+
|
|
83
|
+
if not isinstance(self.embedding, Embeddings):
|
|
84
|
+
msg = "Invalid embedding object"
|
|
85
|
+
raise TypeError(msg)
|
|
86
|
+
|
|
87
|
+
if documents:
|
|
88
|
+
qdrant = Qdrant.from_documents(documents, embedding=self.embedding, **qdrant_kwargs, **server_kwargs)
|
|
89
|
+
else:
|
|
90
|
+
from qdrant_client import QdrantClient
|
|
91
|
+
|
|
92
|
+
client = QdrantClient(**server_kwargs)
|
|
93
|
+
qdrant = Qdrant(embeddings=self.embedding, client=client, **qdrant_kwargs)
|
|
94
|
+
|
|
95
|
+
return qdrant
|
|
96
|
+
|
|
97
|
+
def search_documents(self) -> list[Data]:
|
|
98
|
+
vector_store = self.build_vector_store()
|
|
99
|
+
|
|
100
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
|
101
|
+
docs = vector_store.similarity_search(
|
|
102
|
+
query=self.search_query,
|
|
103
|
+
k=self.number_of_results,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
data = docs_to_data(docs)
|
|
107
|
+
self.status = data
|
|
108
|
+
return data
|
|
109
|
+
return []
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from lfx.components._importing import import_mod
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from .redis import RedisVectorStoreComponent
|
|
9
|
+
from .redis_chat import RedisIndexChatMemory
|
|
10
|
+
|
|
11
|
+
_dynamic_imports = {
|
|
12
|
+
"RedisVectorStoreComponent": "redis",
|
|
13
|
+
"RedisIndexChatMemory": "redis_chat",
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"RedisIndexChatMemory",
|
|
18
|
+
"RedisVectorStoreComponent",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def __getattr__(attr_name: str) -> Any:
|
|
23
|
+
"""Lazily import Redis components on attribute access."""
|
|
24
|
+
if attr_name not in _dynamic_imports:
|
|
25
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
26
|
+
raise AttributeError(msg)
|
|
27
|
+
try:
|
|
28
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
29
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
30
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
31
|
+
raise AttributeError(msg) from e
|
|
32
|
+
globals()[attr_name] = result
|
|
33
|
+
return result
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def __dir__() -> list[str]:
|
|
37
|
+
return list(__all__)
|