lfx-nightly 0.1.11.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +268 -0
- lfx/base/agents/callback.py +130 -0
- lfx/base/agents/context.py +109 -0
- lfx/base/agents/crewai/__init__.py +0 -0
- lfx/base/agents/crewai/crew.py +231 -0
- lfx/base/agents/crewai/tasks.py +12 -0
- lfx/base/agents/default_prompts.py +23 -0
- lfx/base/agents/errors.py +15 -0
- lfx/base/agents/events.py +346 -0
- lfx/base/agents/utils.py +205 -0
- lfx/base/astra_assistants/__init__.py +0 -0
- lfx/base/astra_assistants/util.py +171 -0
- lfx/base/chains/__init__.py +0 -0
- lfx/base/chains/model.py +19 -0
- lfx/base/composio/__init__.py +0 -0
- lfx/base/composio/composio_base.py +1291 -0
- lfx/base/compressors/__init__.py +0 -0
- lfx/base/compressors/model.py +60 -0
- lfx/base/constants.py +46 -0
- lfx/base/curl/__init__.py +0 -0
- lfx/base/curl/parse.py +188 -0
- lfx/base/data/__init__.py +5 -0
- lfx/base/data/base_file.py +685 -0
- lfx/base/data/docling_utils.py +245 -0
- lfx/base/data/utils.py +198 -0
- lfx/base/document_transformers/__init__.py +0 -0
- lfx/base/document_transformers/model.py +43 -0
- lfx/base/embeddings/__init__.py +0 -0
- lfx/base/embeddings/aiml_embeddings.py +62 -0
- lfx/base/embeddings/model.py +26 -0
- lfx/base/flow_processing/__init__.py +0 -0
- lfx/base/flow_processing/utils.py +86 -0
- lfx/base/huggingface/__init__.py +0 -0
- lfx/base/huggingface/model_bridge.py +133 -0
- lfx/base/io/__init__.py +0 -0
- lfx/base/io/chat.py +20 -0
- lfx/base/io/text.py +22 -0
- lfx/base/langchain_utilities/__init__.py +0 -0
- lfx/base/langchain_utilities/model.py +35 -0
- lfx/base/langchain_utilities/spider_constants.py +1 -0
- lfx/base/langwatch/__init__.py +0 -0
- lfx/base/langwatch/utils.py +18 -0
- lfx/base/mcp/__init__.py +0 -0
- lfx/base/mcp/constants.py +2 -0
- lfx/base/mcp/util.py +1398 -0
- lfx/base/memory/__init__.py +0 -0
- lfx/base/memory/memory.py +49 -0
- lfx/base/memory/model.py +38 -0
- lfx/base/models/__init__.py +3 -0
- lfx/base/models/aiml_constants.py +51 -0
- lfx/base/models/anthropic_constants.py +47 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/groq_constants.py +134 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +307 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +8 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +49 -0
- lfx/base/models/openai_constants.py +122 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/processing/__init__.py +0 -0
- lfx/base/prompts/__init__.py +0 -0
- lfx/base/prompts/api_utils.py +224 -0
- lfx/base/prompts/utils.py +61 -0
- lfx/base/textsplitters/__init__.py +0 -0
- lfx/base/textsplitters/model.py +28 -0
- lfx/base/tools/__init__.py +0 -0
- lfx/base/tools/base.py +26 -0
- lfx/base/tools/component_tool.py +325 -0
- lfx/base/tools/constants.py +49 -0
- lfx/base/tools/flow_tool.py +132 -0
- lfx/base/tools/run_flow.py +224 -0
- lfx/base/vectorstores/__init__.py +0 -0
- lfx/base/vectorstores/model.py +193 -0
- lfx/base/vectorstores/utils.py +22 -0
- lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
- lfx/cli/__init__.py +5 -0
- lfx/cli/commands.py +319 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +441 -0
- lfx/cli/script_loader.py +247 -0
- lfx/cli/serve_app.py +546 -0
- lfx/cli/validation.py +69 -0
- lfx/components/FAISS/__init__.py +34 -0
- lfx/components/FAISS/faiss.py +111 -0
- lfx/components/Notion/__init__.py +19 -0
- lfx/components/Notion/add_content_to_page.py +269 -0
- lfx/components/Notion/create_page.py +94 -0
- lfx/components/Notion/list_database_properties.py +68 -0
- lfx/components/Notion/list_pages.py +122 -0
- lfx/components/Notion/list_users.py +77 -0
- lfx/components/Notion/page_content_viewer.py +93 -0
- lfx/components/Notion/search.py +111 -0
- lfx/components/Notion/update_page_property.py +114 -0
- lfx/components/__init__.py +411 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/agents/__init__.py +34 -0
- lfx/components/agents/agent.py +558 -0
- lfx/components/agents/mcp_component.py +501 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +112 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +124 -0
- lfx/components/amazon/s3_bucket_uploader.py +211 -0
- lfx/components/anthropic/__init__.py +34 -0
- lfx/components/anthropic/anthropic.py +187 -0
- lfx/components/apify/__init__.py +5 -0
- lfx/components/apify/apify_actor.py +325 -0
- lfx/components/arxiv/__init__.py +3 -0
- lfx/components/arxiv/arxiv.py +163 -0
- lfx/components/assemblyai/__init__.py +46 -0
- lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- lfx/components/assemblyai/assemblyai_lemur.py +183 -0
- lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
- lfx/components/azure/__init__.py +37 -0
- lfx/components/azure/azure_openai.py +95 -0
- lfx/components/azure/azure_openai_embeddings.py +83 -0
- lfx/components/baidu/__init__.py +32 -0
- lfx/components/baidu/baidu_qianfan_chat.py +113 -0
- lfx/components/bing/__init__.py +3 -0
- lfx/components/bing/bing_search_api.py +61 -0
- lfx/components/cassandra/__init__.py +40 -0
- lfx/components/cassandra/cassandra.py +264 -0
- lfx/components/cassandra/cassandra_chat.py +92 -0
- lfx/components/cassandra/cassandra_graph.py +238 -0
- lfx/components/chains/__init__.py +3 -0
- lfx/components/chroma/__init__.py +34 -0
- lfx/components/chroma/chroma.py +167 -0
- lfx/components/cleanlab/__init__.py +40 -0
- lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
- lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- lfx/components/cleanlab/cleanlab_remediator.py +131 -0
- lfx/components/clickhouse/__init__.py +34 -0
- lfx/components/clickhouse/clickhouse.py +135 -0
- lfx/components/cloudflare/__init__.py +32 -0
- lfx/components/cloudflare/cloudflare.py +81 -0
- lfx/components/cohere/__init__.py +40 -0
- lfx/components/cohere/cohere_embeddings.py +81 -0
- lfx/components/cohere/cohere_models.py +46 -0
- lfx/components/cohere/cohere_rerank.py +51 -0
- lfx/components/composio/__init__.py +74 -0
- lfx/components/composio/composio_api.py +268 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/slack_composio.py +582 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/youtube_composio.py +11 -0
- lfx/components/confluence/__init__.py +3 -0
- lfx/components/confluence/confluence.py +84 -0
- lfx/components/couchbase/__init__.py +34 -0
- lfx/components/couchbase/couchbase.py +102 -0
- lfx/components/crewai/__init__.py +49 -0
- lfx/components/crewai/crewai.py +107 -0
- lfx/components/crewai/hierarchical_crew.py +46 -0
- lfx/components/crewai/hierarchical_task.py +44 -0
- lfx/components/crewai/sequential_crew.py +52 -0
- lfx/components/crewai/sequential_task.py +73 -0
- lfx/components/crewai/sequential_task_agent.py +143 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +64 -0
- lfx/components/data/api_request.py +544 -0
- lfx/components/data/csv_to_data.py +95 -0
- lfx/components/data/directory.py +113 -0
- lfx/components/data/file.py +577 -0
- lfx/components/data/json_to_data.py +98 -0
- lfx/components/data/news_search.py +164 -0
- lfx/components/data/rss.py +69 -0
- lfx/components/data/sql_executor.py +101 -0
- lfx/components/data/url.py +311 -0
- lfx/components/data/web_search.py +112 -0
- lfx/components/data/webhook.py +56 -0
- lfx/components/datastax/__init__.py +70 -0
- lfx/components/datastax/astra_assistant_manager.py +306 -0
- lfx/components/datastax/astra_db.py +75 -0
- lfx/components/datastax/astra_vectorize.py +124 -0
- lfx/components/datastax/astradb.py +1285 -0
- lfx/components/datastax/astradb_cql.py +314 -0
- lfx/components/datastax/astradb_graph.py +330 -0
- lfx/components/datastax/astradb_tool.py +414 -0
- lfx/components/datastax/astradb_vectorstore.py +1285 -0
- lfx/components/datastax/cassandra.py +92 -0
- lfx/components/datastax/create_assistant.py +58 -0
- lfx/components/datastax/create_thread.py +32 -0
- lfx/components/datastax/dotenv.py +35 -0
- lfx/components/datastax/get_assistant.py +37 -0
- lfx/components/datastax/getenvvar.py +30 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +314 -0
- lfx/components/datastax/list_assistants.py +25 -0
- lfx/components/datastax/run.py +89 -0
- lfx/components/deactivated/__init__.py +15 -0
- lfx/components/deactivated/amazon_kendra.py +66 -0
- lfx/components/deactivated/chat_litellm_model.py +158 -0
- lfx/components/deactivated/code_block_extractor.py +26 -0
- lfx/components/deactivated/documents_to_data.py +22 -0
- lfx/components/deactivated/embed.py +16 -0
- lfx/components/deactivated/extract_key_from_data.py +46 -0
- lfx/components/deactivated/json_document_builder.py +57 -0
- lfx/components/deactivated/list_flows.py +20 -0
- lfx/components/deactivated/mcp_sse.py +61 -0
- lfx/components/deactivated/mcp_stdio.py +62 -0
- lfx/components/deactivated/merge_data.py +93 -0
- lfx/components/deactivated/message.py +37 -0
- lfx/components/deactivated/metal.py +54 -0
- lfx/components/deactivated/multi_query.py +59 -0
- lfx/components/deactivated/retriever.py +43 -0
- lfx/components/deactivated/selective_passthrough.py +77 -0
- lfx/components/deactivated/should_run_next.py +40 -0
- lfx/components/deactivated/split_text.py +63 -0
- lfx/components/deactivated/store_message.py +24 -0
- lfx/components/deactivated/sub_flow.py +124 -0
- lfx/components/deactivated/vectara_self_query.py +76 -0
- lfx/components/deactivated/vector_store.py +24 -0
- lfx/components/deepseek/__init__.py +34 -0
- lfx/components/deepseek/deepseek.py +136 -0
- lfx/components/docling/__init__.py +43 -0
- lfx/components/docling/chunk_docling_document.py +186 -0
- lfx/components/docling/docling_inline.py +231 -0
- lfx/components/docling/docling_remote.py +193 -0
- lfx/components/docling/export_docling_document.py +117 -0
- lfx/components/documentloaders/__init__.py +3 -0
- lfx/components/duckduckgo/__init__.py +3 -0
- lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- lfx/components/elastic/__init__.py +37 -0
- lfx/components/elastic/elasticsearch.py +267 -0
- lfx/components/elastic/opensearch.py +243 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +76 -0
- lfx/components/embeddings/text_embedder.py +64 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/firecrawl/__init__.py +43 -0
- lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
- lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
- lfx/components/firecrawl/firecrawl_map_api.py +89 -0
- lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
- lfx/components/git/__init__.py +4 -0
- lfx/components/git/git.py +262 -0
- lfx/components/git/gitextractor.py +196 -0
- lfx/components/glean/__init__.py +3 -0
- lfx/components/glean/glean_search_api.py +173 -0
- lfx/components/google/__init__.py +17 -0
- lfx/components/google/gmail.py +192 -0
- lfx/components/google/google_bq_sql_executor.py +157 -0
- lfx/components/google/google_drive.py +92 -0
- lfx/components/google/google_drive_search.py +152 -0
- lfx/components/google/google_generative_ai.py +147 -0
- lfx/components/google/google_generative_ai_embeddings.py +141 -0
- lfx/components/google/google_oauth_token.py +89 -0
- lfx/components/google/google_search_api_core.py +68 -0
- lfx/components/google/google_serper_api_core.py +74 -0
- lfx/components/groq/__init__.py +34 -0
- lfx/components/groq/groq.py +136 -0
- lfx/components/helpers/__init__.py +52 -0
- lfx/components/helpers/calculator_core.py +89 -0
- lfx/components/helpers/create_list.py +40 -0
- lfx/components/helpers/current_date.py +42 -0
- lfx/components/helpers/id_generator.py +42 -0
- lfx/components/helpers/memory.py +251 -0
- lfx/components/helpers/output_parser.py +45 -0
- lfx/components/helpers/store_message.py +90 -0
- lfx/components/homeassistant/__init__.py +7 -0
- lfx/components/homeassistant/home_assistant_control.py +152 -0
- lfx/components/homeassistant/list_home_assistant_states.py +137 -0
- lfx/components/huggingface/__init__.py +37 -0
- lfx/components/huggingface/huggingface.py +197 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +203 -0
- lfx/components/ibm/watsonx_embeddings.py +135 -0
- lfx/components/icosacomputing/__init__.py +5 -0
- lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
- lfx/components/input_output/__init__.py +38 -0
- lfx/components/input_output/chat.py +120 -0
- lfx/components/input_output/chat_output.py +200 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/jigsawstack/__init__.py +23 -0
- lfx/components/jigsawstack/ai_scrape.py +126 -0
- lfx/components/jigsawstack/ai_web_search.py +136 -0
- lfx/components/jigsawstack/file_read.py +115 -0
- lfx/components/jigsawstack/file_upload.py +94 -0
- lfx/components/jigsawstack/image_generation.py +205 -0
- lfx/components/jigsawstack/nsfw.py +60 -0
- lfx/components/jigsawstack/object_detection.py +124 -0
- lfx/components/jigsawstack/sentiment.py +112 -0
- lfx/components/jigsawstack/text_to_sql.py +90 -0
- lfx/components/jigsawstack/text_translate.py +77 -0
- lfx/components/jigsawstack/vocr.py +107 -0
- lfx/components/langchain_utilities/__init__.py +109 -0
- lfx/components/langchain_utilities/character.py +53 -0
- lfx/components/langchain_utilities/conversation.py +59 -0
- lfx/components/langchain_utilities/csv_agent.py +107 -0
- lfx/components/langchain_utilities/fake_embeddings.py +26 -0
- lfx/components/langchain_utilities/html_link_extractor.py +35 -0
- lfx/components/langchain_utilities/json_agent.py +45 -0
- lfx/components/langchain_utilities/langchain_hub.py +126 -0
- lfx/components/langchain_utilities/language_recursive.py +49 -0
- lfx/components/langchain_utilities/language_semantic.py +138 -0
- lfx/components/langchain_utilities/llm_checker.py +39 -0
- lfx/components/langchain_utilities/llm_math.py +42 -0
- lfx/components/langchain_utilities/natural_language.py +61 -0
- lfx/components/langchain_utilities/openai_tools.py +53 -0
- lfx/components/langchain_utilities/openapi.py +48 -0
- lfx/components/langchain_utilities/recursive_character.py +60 -0
- lfx/components/langchain_utilities/retrieval_qa.py +83 -0
- lfx/components/langchain_utilities/runnable_executor.py +137 -0
- lfx/components/langchain_utilities/self_query.py +80 -0
- lfx/components/langchain_utilities/spider.py +142 -0
- lfx/components/langchain_utilities/sql.py +40 -0
- lfx/components/langchain_utilities/sql_database.py +35 -0
- lfx/components/langchain_utilities/sql_generator.py +78 -0
- lfx/components/langchain_utilities/tool_calling.py +59 -0
- lfx/components/langchain_utilities/vector_store_info.py +49 -0
- lfx/components/langchain_utilities/vector_store_router.py +33 -0
- lfx/components/langchain_utilities/xml_agent.py +71 -0
- lfx/components/langwatch/__init__.py +3 -0
- lfx/components/langwatch/langwatch.py +278 -0
- lfx/components/link_extractors/__init__.py +3 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +129 -0
- lfx/components/logic/__init__.py +52 -0
- lfx/components/logic/conditional_router.py +171 -0
- lfx/components/logic/data_conditional_router.py +125 -0
- lfx/components/logic/flow_tool.py +110 -0
- lfx/components/logic/listen.py +29 -0
- lfx/components/logic/loop.py +125 -0
- lfx/components/logic/notify.py +88 -0
- lfx/components/logic/pass_message.py +35 -0
- lfx/components/logic/run_flow.py +71 -0
- lfx/components/logic/sub_flow.py +114 -0
- lfx/components/maritalk/__init__.py +32 -0
- lfx/components/maritalk/maritalk.py +52 -0
- lfx/components/mem0/__init__.py +3 -0
- lfx/components/mem0/mem0_chat_memory.py +136 -0
- lfx/components/milvus/__init__.py +34 -0
- lfx/components/milvus/milvus.py +115 -0
- lfx/components/mistral/__init__.py +37 -0
- lfx/components/mistral/mistral.py +114 -0
- lfx/components/mistral/mistral_embeddings.py +58 -0
- lfx/components/models/__init__.py +34 -0
- lfx/components/models/embedding_model.py +114 -0
- lfx/components/models/language_model.py +144 -0
- lfx/components/mongodb/__init__.py +34 -0
- lfx/components/mongodb/mongodb_atlas.py +213 -0
- lfx/components/needle/__init__.py +3 -0
- lfx/components/needle/needle.py +104 -0
- lfx/components/notdiamond/__init__.py +34 -0
- lfx/components/notdiamond/notdiamond.py +228 -0
- lfx/components/novita/__init__.py +32 -0
- lfx/components/novita/novita.py +130 -0
- lfx/components/nvidia/__init__.py +57 -0
- lfx/components/nvidia/nvidia.py +157 -0
- lfx/components/nvidia/nvidia_embedding.py +77 -0
- lfx/components/nvidia/nvidia_ingest.py +317 -0
- lfx/components/nvidia/nvidia_rerank.py +63 -0
- lfx/components/nvidia/system_assist.py +65 -0
- lfx/components/olivya/__init__.py +3 -0
- lfx/components/olivya/olivya.py +116 -0
- lfx/components/ollama/__init__.py +37 -0
- lfx/components/ollama/ollama.py +330 -0
- lfx/components/ollama/ollama_embeddings.py +106 -0
- lfx/components/openai/__init__.py +37 -0
- lfx/components/openai/openai.py +100 -0
- lfx/components/openai/openai_chat_model.py +176 -0
- lfx/components/openrouter/__init__.py +32 -0
- lfx/components/openrouter/openrouter.py +202 -0
- lfx/components/output_parsers/__init__.py +3 -0
- lfx/components/perplexity/__init__.py +34 -0
- lfx/components/perplexity/perplexity.py +75 -0
- lfx/components/pgvector/__init__.py +34 -0
- lfx/components/pgvector/pgvector.py +72 -0
- lfx/components/pinecone/__init__.py +34 -0
- lfx/components/pinecone/pinecone.py +134 -0
- lfx/components/processing/__init__.py +117 -0
- lfx/components/processing/alter_metadata.py +108 -0
- lfx/components/processing/batch_run.py +205 -0
- lfx/components/processing/combine_text.py +39 -0
- lfx/components/processing/converter.py +159 -0
- lfx/components/processing/create_data.py +110 -0
- lfx/components/processing/data_operations.py +438 -0
- lfx/components/processing/data_to_dataframe.py +70 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/extract_key.py +53 -0
- lfx/components/processing/filter_data.py +42 -0
- lfx/components/processing/filter_data_values.py +88 -0
- lfx/components/processing/json_cleaner.py +103 -0
- lfx/components/processing/lambda_filter.py +154 -0
- lfx/components/processing/llm_router.py +499 -0
- lfx/components/processing/merge_data.py +90 -0
- lfx/components/processing/message_to_data.py +36 -0
- lfx/components/processing/parse_data.py +70 -0
- lfx/components/processing/parse_dataframe.py +68 -0
- lfx/components/processing/parse_json_data.py +90 -0
- lfx/components/processing/parser.py +143 -0
- lfx/components/processing/prompt.py +67 -0
- lfx/components/processing/python_repl_core.py +98 -0
- lfx/components/processing/regex.py +82 -0
- lfx/components/processing/save_file.py +225 -0
- lfx/components/processing/select_data.py +48 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/structured_output.py +202 -0
- lfx/components/processing/update_data.py +160 -0
- lfx/components/prototypes/__init__.py +34 -0
- lfx/components/prototypes/python_function.py +73 -0
- lfx/components/qdrant/__init__.py +34 -0
- lfx/components/qdrant/qdrant.py +109 -0
- lfx/components/redis/__init__.py +37 -0
- lfx/components/redis/redis.py +89 -0
- lfx/components/redis/redis_chat.py +43 -0
- lfx/components/sambanova/__init__.py +32 -0
- lfx/components/sambanova/sambanova.py +84 -0
- lfx/components/scrapegraph/__init__.py +40 -0
- lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- lfx/components/searchapi/__init__.py +34 -0
- lfx/components/searchapi/search.py +79 -0
- lfx/components/serpapi/__init__.py +3 -0
- lfx/components/serpapi/serp.py +115 -0
- lfx/components/supabase/__init__.py +34 -0
- lfx/components/supabase/supabase.py +76 -0
- lfx/components/tavily/__init__.py +4 -0
- lfx/components/tavily/tavily_extract.py +117 -0
- lfx/components/tavily/tavily_search.py +212 -0
- lfx/components/textsplitters/__init__.py +3 -0
- lfx/components/toolkits/__init__.py +3 -0
- lfx/components/tools/__init__.py +72 -0
- lfx/components/tools/calculator.py +108 -0
- lfx/components/tools/google_search_api.py +45 -0
- lfx/components/tools/google_serper_api.py +115 -0
- lfx/components/tools/python_code_structured_tool.py +327 -0
- lfx/components/tools/python_repl.py +97 -0
- lfx/components/tools/search_api.py +87 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +119 -0
- lfx/components/tools/tavily_search_tool.py +344 -0
- lfx/components/tools/wikidata_api.py +102 -0
- lfx/components/tools/wikipedia_api.py +49 -0
- lfx/components/tools/yahoo_finance.py +129 -0
- lfx/components/twelvelabs/__init__.py +52 -0
- lfx/components/twelvelabs/convert_astra_results.py +84 -0
- lfx/components/twelvelabs/pegasus_index.py +311 -0
- lfx/components/twelvelabs/split_video.py +291 -0
- lfx/components/twelvelabs/text_embeddings.py +57 -0
- lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- lfx/components/twelvelabs/video_embeddings.py +100 -0
- lfx/components/twelvelabs/video_file.py +179 -0
- lfx/components/unstructured/__init__.py +3 -0
- lfx/components/unstructured/unstructured.py +121 -0
- lfx/components/upstash/__init__.py +34 -0
- lfx/components/upstash/upstash.py +124 -0
- lfx/components/vectara/__init__.py +37 -0
- lfx/components/vectara/vectara.py +97 -0
- lfx/components/vectara/vectara_rag.py +164 -0
- lfx/components/vectorstores/__init__.py +40 -0
- lfx/components/vectorstores/astradb.py +1285 -0
- lfx/components/vectorstores/astradb_graph.py +319 -0
- lfx/components/vectorstores/cassandra.py +264 -0
- lfx/components/vectorstores/cassandra_graph.py +238 -0
- lfx/components/vectorstores/chroma.py +167 -0
- lfx/components/vectorstores/clickhouse.py +135 -0
- lfx/components/vectorstores/couchbase.py +102 -0
- lfx/components/vectorstores/elasticsearch.py +267 -0
- lfx/components/vectorstores/faiss.py +111 -0
- lfx/components/vectorstores/graph_rag.py +141 -0
- lfx/components/vectorstores/hcd.py +314 -0
- lfx/components/vectorstores/local_db.py +261 -0
- lfx/components/vectorstores/milvus.py +115 -0
- lfx/components/vectorstores/mongodb_atlas.py +213 -0
- lfx/components/vectorstores/opensearch.py +243 -0
- lfx/components/vectorstores/pgvector.py +72 -0
- lfx/components/vectorstores/pinecone.py +134 -0
- lfx/components/vectorstores/qdrant.py +109 -0
- lfx/components/vectorstores/supabase.py +76 -0
- lfx/components/vectorstores/upstash.py +124 -0
- lfx/components/vectorstores/vectara.py +97 -0
- lfx/components/vectorstores/vectara_rag.py +164 -0
- lfx/components/vectorstores/weaviate.py +89 -0
- lfx/components/vertexai/__init__.py +37 -0
- lfx/components/vertexai/vertexai.py +71 -0
- lfx/components/vertexai/vertexai_embeddings.py +67 -0
- lfx/components/weaviate/__init__.py +34 -0
- lfx/components/weaviate/weaviate.py +89 -0
- lfx/components/wikipedia/__init__.py +4 -0
- lfx/components/wikipedia/wikidata.py +86 -0
- lfx/components/wikipedia/wikipedia.py +53 -0
- lfx/components/wolframalpha/__init__.py +3 -0
- lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
- lfx/components/xai/__init__.py +32 -0
- lfx/components/xai/xai.py +167 -0
- lfx/components/yahoosearch/__init__.py +3 -0
- lfx/components/yahoosearch/yahoo.py +137 -0
- lfx/components/youtube/__init__.py +52 -0
- lfx/components/youtube/channel.py +227 -0
- lfx/components/youtube/comments.py +231 -0
- lfx/components/youtube/playlist.py +33 -0
- lfx/components/youtube/search.py +120 -0
- lfx/components/youtube/trending.py +285 -0
- lfx/components/youtube/video_details.py +263 -0
- lfx/components/youtube/youtube_transcripts.py +118 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +44 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +86 -0
- lfx/custom/code_parser/__init__.py +3 -0
- lfx/custom/code_parser/code_parser.py +361 -0
- lfx/custom/custom_component/__init__.py +0 -0
- lfx/custom/custom_component/base_component.py +128 -0
- lfx/custom/custom_component/component.py +1808 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +588 -0
- lfx/custom/dependency_analyzer.py +165 -0
- lfx/custom/directory_reader/__init__.py +3 -0
- lfx/custom/directory_reader/directory_reader.py +359 -0
- lfx/custom/directory_reader/utils.py +171 -0
- lfx/custom/eval.py +12 -0
- lfx/custom/schema.py +32 -0
- lfx/custom/tree_visitor.py +21 -0
- lfx/custom/utils.py +877 -0
- lfx/custom/validate.py +488 -0
- lfx/events/__init__.py +1 -0
- lfx/events/event_manager.py +110 -0
- lfx/exceptions/__init__.py +0 -0
- lfx/exceptions/component.py +15 -0
- lfx/field_typing/__init__.py +91 -0
- lfx/field_typing/constants.py +215 -0
- lfx/field_typing/range_spec.py +35 -0
- lfx/graph/__init__.py +6 -0
- lfx/graph/edge/__init__.py +0 -0
- lfx/graph/edge/base.py +277 -0
- lfx/graph/edge/schema.py +119 -0
- lfx/graph/edge/utils.py +0 -0
- lfx/graph/graph/__init__.py +0 -0
- lfx/graph/graph/ascii.py +202 -0
- lfx/graph/graph/base.py +2238 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +52 -0
- lfx/graph/graph/state_model.py +66 -0
- lfx/graph/graph/utils.py +1024 -0
- lfx/graph/schema.py +75 -0
- lfx/graph/state/__init__.py +0 -0
- lfx/graph/state/model.py +237 -0
- lfx/graph/utils.py +200 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +823 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +264 -0
- lfx/graph/vertex/schema.py +26 -0
- lfx/graph/vertex/utils.py +19 -0
- lfx/graph/vertex/vertex_types.py +489 -0
- lfx/helpers/__init__.py +1 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +194 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +328 -0
- lfx/inputs/inputs.py +714 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +489 -0
- lfx/interface/importing/__init__.py +5 -0
- lfx/interface/importing/utils.py +39 -0
- lfx/interface/initialize/__init__.py +3 -0
- lfx/interface/initialize/loading.py +224 -0
- lfx/interface/listing.py +26 -0
- lfx/interface/run.py +16 -0
- lfx/interface/utils.py +111 -0
- lfx/io/__init__.py +63 -0
- lfx/io/schema.py +289 -0
- lfx/load/__init__.py +8 -0
- lfx/load/load.py +256 -0
- lfx/load/utils.py +99 -0
- lfx/log/__init__.py +5 -0
- lfx/log/logger.py +385 -0
- lfx/memory/__init__.py +90 -0
- lfx/memory/stubs.py +283 -0
- lfx/processing/__init__.py +1 -0
- lfx/processing/process.py +238 -0
- lfx/processing/utils.py +25 -0
- lfx/py.typed +0 -0
- lfx/schema/__init__.py +66 -0
- lfx/schema/artifact.py +83 -0
- lfx/schema/content_block.py +62 -0
- lfx/schema/content_types.py +91 -0
- lfx/schema/data.py +308 -0
- lfx/schema/dataframe.py +210 -0
- lfx/schema/dotdict.py +74 -0
- lfx/schema/encoders.py +13 -0
- lfx/schema/graph.py +47 -0
- lfx/schema/image.py +131 -0
- lfx/schema/json_schema.py +141 -0
- lfx/schema/log.py +61 -0
- lfx/schema/message.py +473 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +171 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +140 -0
- lfx/schema/validators.py +114 -0
- lfx/serialization/__init__.py +5 -0
- lfx/serialization/constants.py +2 -0
- lfx/serialization/serialization.py +314 -0
- lfx/services/__init__.py +23 -0
- lfx/services/base.py +28 -0
- lfx/services/cache/__init__.py +6 -0
- lfx/services/cache/base.py +183 -0
- lfx/services/cache/service.py +166 -0
- lfx/services/cache/utils.py +169 -0
- lfx/services/chat/__init__.py +1 -0
- lfx/services/chat/config.py +2 -0
- lfx/services/chat/schema.py +10 -0
- lfx/services/deps.py +129 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +172 -0
- lfx/services/schema.py +20 -0
- lfx/services/session.py +82 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +130 -0
- lfx/services/settings/base.py +539 -0
- lfx/services/settings/constants.py +31 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +12 -0
- lfx/services/settings/service.py +35 -0
- lfx/services/settings/utils.py +40 -0
- lfx/services/shared_component_cache/__init__.py +1 -0
- lfx/services/shared_component_cache/factory.py +30 -0
- lfx/services/shared_component_cache/service.py +9 -0
- lfx/services/storage/__init__.py +5 -0
- lfx/services/storage/local.py +155 -0
- lfx/services/storage/service.py +54 -0
- lfx/services/tracing/__init__.py +1 -0
- lfx/services/tracing/service.py +21 -0
- lfx/settings.py +6 -0
- lfx/template/__init__.py +6 -0
- lfx/template/field/__init__.py +0 -0
- lfx/template/field/base.py +257 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +212 -0
- lfx/template/frontend_node/constants.py +65 -0
- lfx/template/frontend_node/custom_components.py +79 -0
- lfx/template/template/__init__.py +0 -0
- lfx/template/template/base.py +100 -0
- lfx/template/utils.py +217 -0
- lfx/type_extraction/__init__.py +19 -0
- lfx/type_extraction/type_extraction.py +75 -0
- lfx/type_extraction.py +80 -0
- lfx/utils/__init__.py +1 -0
- lfx/utils/async_helpers.py +42 -0
- lfx/utils/component_utils.py +154 -0
- lfx/utils/concurrency.py +60 -0
- lfx/utils/connection_string_parser.py +11 -0
- lfx/utils/constants.py +205 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +28 -0
- lfx/utils/image.py +73 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/util.py +481 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
- lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
- lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
- lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,224 @@
|
|
1
|
+
from abc import abstractmethod
|
2
|
+
from typing import TYPE_CHECKING
|
3
|
+
|
4
|
+
from lfx.custom.custom_component.component import Component, get_component_toolkit
|
5
|
+
from lfx.field_typing import Tool
|
6
|
+
from lfx.graph.graph.base import Graph
|
7
|
+
from lfx.graph.vertex.base import Vertex
|
8
|
+
from lfx.helpers.flow import get_flow_inputs
|
9
|
+
from lfx.inputs.inputs import DropdownInput, InputTypes, MessageInput
|
10
|
+
from lfx.log.logger import logger
|
11
|
+
from lfx.schema.data import Data
|
12
|
+
from lfx.schema.dataframe import DataFrame
|
13
|
+
from lfx.schema.dotdict import dotdict
|
14
|
+
from lfx.schema.message import Message
|
15
|
+
from lfx.template.field.base import Output
|
16
|
+
|
17
|
+
if TYPE_CHECKING:
|
18
|
+
from lfx.base.tools.component_tool import ComponentToolkit
|
19
|
+
|
20
|
+
|
21
|
+
class RunFlowBaseComponent(Component):
|
22
|
+
def __init__(self, *args, **kwargs):
|
23
|
+
super().__init__(*args, **kwargs)
|
24
|
+
self.add_tool_output = True
|
25
|
+
|
26
|
+
_base_inputs: list[InputTypes] = [
|
27
|
+
DropdownInput(
|
28
|
+
name="flow_name_selected",
|
29
|
+
display_name="Flow Name",
|
30
|
+
info="The name of the flow to run.",
|
31
|
+
options=[],
|
32
|
+
real_time_refresh=True,
|
33
|
+
value=None,
|
34
|
+
),
|
35
|
+
MessageInput(
|
36
|
+
name="session_id",
|
37
|
+
display_name="Session ID",
|
38
|
+
info="The session ID to run the flow in.",
|
39
|
+
value="",
|
40
|
+
advanced=True,
|
41
|
+
),
|
42
|
+
]
|
43
|
+
_base_outputs: list[Output] = [
|
44
|
+
Output(
|
45
|
+
name="flow_outputs_data",
|
46
|
+
display_name="Flow Data Output",
|
47
|
+
method="data_output",
|
48
|
+
hidden=True,
|
49
|
+
group_outputs=True,
|
50
|
+
tool_mode=False, # This output is not intended to be used as a tool, so tool_mode is disabled.
|
51
|
+
),
|
52
|
+
Output(
|
53
|
+
name="flow_outputs_dataframe",
|
54
|
+
display_name="Flow Dataframe Output",
|
55
|
+
method="dataframe_output",
|
56
|
+
hidden=True,
|
57
|
+
group_outputs=True,
|
58
|
+
tool_mode=False, # This output is not intended to be used as a tool, so tool_mode is disabled.
|
59
|
+
),
|
60
|
+
Output(
|
61
|
+
name="flow_outputs_message", group_outputs=True, display_name="Flow Message Output", method="message_output"
|
62
|
+
),
|
63
|
+
]
|
64
|
+
default_keys = ["code", "_type", "flow_name_selected", "session_id"]
|
65
|
+
FLOW_INPUTS: list[dotdict] = []
|
66
|
+
flow_tweak_data: dict = {}
|
67
|
+
|
68
|
+
@abstractmethod
|
69
|
+
async def run_flow_with_tweaks(self) -> list[Data]:
|
70
|
+
"""Run the flow with tweaks."""
|
71
|
+
|
72
|
+
async def data_output(self) -> Data:
|
73
|
+
"""Return the data output."""
|
74
|
+
run_outputs = await self.run_flow_with_tweaks()
|
75
|
+
first_output = run_outputs[0]
|
76
|
+
|
77
|
+
if isinstance(first_output, Data):
|
78
|
+
return first_output
|
79
|
+
|
80
|
+
# just adaptive output Message
|
81
|
+
_, message_result = next(iter(run_outputs[0].outputs[0].results.items()))
|
82
|
+
message_data = message_result.data
|
83
|
+
return Data(data=message_data)
|
84
|
+
|
85
|
+
async def dataframe_output(self) -> DataFrame:
|
86
|
+
"""Return the dataframe output."""
|
87
|
+
run_outputs = await self.run_flow_with_tweaks()
|
88
|
+
first_output = run_outputs[0]
|
89
|
+
|
90
|
+
if isinstance(first_output, DataFrame):
|
91
|
+
return first_output
|
92
|
+
|
93
|
+
# just adaptive output Message
|
94
|
+
_, message_result = next(iter(run_outputs[0].outputs[0].results.items()))
|
95
|
+
message_data = message_result.data
|
96
|
+
return DataFrame(data=message_data if isinstance(message_data, list) else [message_data])
|
97
|
+
|
98
|
+
async def message_output(self) -> Message:
|
99
|
+
"""Return the message output."""
|
100
|
+
run_outputs = await self.run_flow_with_tweaks()
|
101
|
+
_, message_result = next(iter(run_outputs[0].outputs[0].results.items()))
|
102
|
+
if isinstance(message_result, Message):
|
103
|
+
return message_result
|
104
|
+
if isinstance(message_result, str):
|
105
|
+
return Message(text=message_result)
|
106
|
+
return Message(text=message_result.data["text"])
|
107
|
+
|
108
|
+
async def get_flow_names(self) -> list[str]:
|
109
|
+
# TODO: get flfow ID with flow name
|
110
|
+
flow_data = await self.alist_flows()
|
111
|
+
return [flow_data.data["name"] for flow_data in flow_data]
|
112
|
+
|
113
|
+
async def get_flow(self, flow_name_selected: str) -> Data | None:
|
114
|
+
# get flow from flow id
|
115
|
+
flow_datas = await self.alist_flows()
|
116
|
+
for flow_data in flow_datas:
|
117
|
+
if flow_data.data["name"] == flow_name_selected:
|
118
|
+
return flow_data
|
119
|
+
return None
|
120
|
+
|
121
|
+
async def get_graph(self, flow_name_selected: str | None = None) -> Graph:
|
122
|
+
if flow_name_selected:
|
123
|
+
flow_data = await self.get_flow(flow_name_selected)
|
124
|
+
if flow_data:
|
125
|
+
return Graph.from_payload(flow_data.data["data"])
|
126
|
+
msg = "Flow not found"
|
127
|
+
raise ValueError(msg)
|
128
|
+
# Ensure a Graph is always returned or an exception is raised
|
129
|
+
msg = "No valid flow JSON or flow name selected."
|
130
|
+
raise ValueError(msg)
|
131
|
+
|
132
|
+
def get_new_fields_from_graph(self, graph: Graph) -> list[dotdict]:
|
133
|
+
inputs = get_flow_inputs(graph)
|
134
|
+
return self.get_new_fields(inputs)
|
135
|
+
|
136
|
+
def update_build_config_from_graph(self, build_config: dotdict, graph: Graph):
|
137
|
+
try:
|
138
|
+
# Get all inputs from the graph
|
139
|
+
new_fields = self.get_new_fields_from_graph(graph)
|
140
|
+
old_fields = self.get_old_fields(build_config, new_fields)
|
141
|
+
self.delete_fields(build_config, old_fields)
|
142
|
+
build_config = self.add_new_fields(build_config, new_fields)
|
143
|
+
|
144
|
+
except Exception as e:
|
145
|
+
msg = "Error updating build config from graph"
|
146
|
+
logger.exception(msg)
|
147
|
+
raise RuntimeError(msg) from e
|
148
|
+
|
149
|
+
def get_new_fields(self, inputs_vertex: list[Vertex]) -> list[dotdict]:
|
150
|
+
new_fields: list[dotdict] = []
|
151
|
+
|
152
|
+
for vertex in inputs_vertex:
|
153
|
+
field_template = vertex.data.get("node", {}).get("template", {})
|
154
|
+
field_order = vertex.data.get("node", {}).get("field_order", [])
|
155
|
+
if field_order and field_template:
|
156
|
+
new_vertex_inputs = [
|
157
|
+
dotdict(
|
158
|
+
{
|
159
|
+
**field_template[input_name],
|
160
|
+
"display_name": vertex.display_name + " - " + field_template[input_name]["display_name"],
|
161
|
+
"name": f"{vertex.id}~{input_name}",
|
162
|
+
"tool_mode": not (field_template[input_name].get("advanced", False)),
|
163
|
+
}
|
164
|
+
)
|
165
|
+
for input_name in field_order
|
166
|
+
if input_name in field_template
|
167
|
+
]
|
168
|
+
new_fields += new_vertex_inputs
|
169
|
+
return new_fields
|
170
|
+
|
171
|
+
def add_new_fields(self, build_config: dotdict, new_fields: list[dotdict]) -> dotdict:
|
172
|
+
"""Add new fields to the build_config."""
|
173
|
+
for field in new_fields:
|
174
|
+
build_config[field["name"]] = field
|
175
|
+
return build_config
|
176
|
+
|
177
|
+
def delete_fields(self, build_config: dotdict, fields: dict | list[str]) -> None:
|
178
|
+
"""Delete specified fields from build_config."""
|
179
|
+
if isinstance(fields, dict):
|
180
|
+
fields = list(fields.keys())
|
181
|
+
for field in fields:
|
182
|
+
build_config.pop(field, None)
|
183
|
+
|
184
|
+
def get_old_fields(self, build_config: dotdict, new_fields: list[dotdict]) -> list[str]:
|
185
|
+
"""Get fields that are in build_config but not in new_fields."""
|
186
|
+
return [
|
187
|
+
field
|
188
|
+
for field in build_config
|
189
|
+
if field not in [new_field["name"] for new_field in new_fields] + self.default_keys
|
190
|
+
]
|
191
|
+
|
192
|
+
async def get_required_data(self, flow_name_selected):
|
193
|
+
self.flow_data = await self.alist_flows()
|
194
|
+
for flow_data in self.flow_data:
|
195
|
+
if flow_data.data["name"] == flow_name_selected:
|
196
|
+
graph = Graph.from_payload(flow_data.data["data"])
|
197
|
+
new_fields = self.get_new_fields_from_graph(graph)
|
198
|
+
new_fields = self.update_input_types(new_fields)
|
199
|
+
|
200
|
+
return flow_data.data["description"], [field for field in new_fields if field.get("tool_mode") is True]
|
201
|
+
return None
|
202
|
+
|
203
|
+
def update_input_types(self, fields: list[dotdict]) -> list[dotdict]:
|
204
|
+
for field in fields:
|
205
|
+
if isinstance(field, dict):
|
206
|
+
if field.get("input_types") is None:
|
207
|
+
field["input_types"] = []
|
208
|
+
elif hasattr(field, "input_types") and field.input_types is None:
|
209
|
+
field.input_types = []
|
210
|
+
return fields
|
211
|
+
|
212
|
+
async def _get_tools(self) -> list[Tool]:
|
213
|
+
component_toolkit: type[ComponentToolkit] = get_component_toolkit()
|
214
|
+
flow_description, tool_mode_inputs = await self.get_required_data(self.flow_name_selected)
|
215
|
+
# # convert list of dicts to list of dotdicts
|
216
|
+
tool_mode_inputs = [dotdict(field) for field in tool_mode_inputs]
|
217
|
+
return component_toolkit(component=self).get_tools(
|
218
|
+
tool_name=f"{self.flow_name_selected}_tool",
|
219
|
+
tool_description=(
|
220
|
+
f"Tool designed to execute the flow '{self.flow_name_selected}'. Flow details: {flow_description}."
|
221
|
+
),
|
222
|
+
callbacks=self.get_langchain_callbacks(),
|
223
|
+
flow_mode_inputs=tool_mode_inputs,
|
224
|
+
)
|
File without changes
|
@@ -0,0 +1,193 @@
|
|
1
|
+
from abc import abstractmethod
|
2
|
+
from functools import wraps
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.custom.custom_component.component import Component
|
6
|
+
from lfx.field_typing import Text, VectorStore
|
7
|
+
from lfx.helpers.data import docs_to_data
|
8
|
+
from lfx.inputs.inputs import BoolInput
|
9
|
+
from lfx.io import HandleInput, Output, QueryInput
|
10
|
+
from lfx.schema.data import Data
|
11
|
+
from lfx.schema.dataframe import DataFrame
|
12
|
+
|
13
|
+
if TYPE_CHECKING:
|
14
|
+
from langchain_core.documents import Document
|
15
|
+
|
16
|
+
|
17
|
+
def check_cached_vector_store(f):
|
18
|
+
"""Decorator to check for cached vector stores, and returns them if they exist.
|
19
|
+
|
20
|
+
Note: caching only occurs during the execution of a component - they do not persist
|
21
|
+
across separate invocations of the component. This method exists so that components with
|
22
|
+
multiple output methods share the same vector store during the same invocation of the
|
23
|
+
component.
|
24
|
+
"""
|
25
|
+
|
26
|
+
@wraps(f)
|
27
|
+
def check_cached(self, *args, **kwargs):
|
28
|
+
should_cache = getattr(self, "should_cache_vector_store", True)
|
29
|
+
|
30
|
+
if should_cache and self._cached_vector_store is not None:
|
31
|
+
return self._cached_vector_store
|
32
|
+
|
33
|
+
result = f(self, *args, **kwargs)
|
34
|
+
self._cached_vector_store = result
|
35
|
+
return result
|
36
|
+
|
37
|
+
check_cached.is_cached_vector_store_checked = True
|
38
|
+
return check_cached
|
39
|
+
|
40
|
+
|
41
|
+
class LCVectorStoreComponent(Component):
|
42
|
+
# Used to ensure a single vector store is built for each run of the flow
|
43
|
+
_cached_vector_store: VectorStore | None = None
|
44
|
+
|
45
|
+
def __init_subclass__(cls, **kwargs):
|
46
|
+
"""Enforces the check cached decorator on all subclasses."""
|
47
|
+
super().__init_subclass__(**kwargs)
|
48
|
+
if hasattr(cls, "build_vector_store"):
|
49
|
+
method = cls.build_vector_store
|
50
|
+
if not hasattr(method, "is_cached_vector_store_checked"):
|
51
|
+
msg = (
|
52
|
+
f"The method 'build_vector_store' in class {cls.__name__} "
|
53
|
+
"must be decorated with @check_cached_vector_store"
|
54
|
+
)
|
55
|
+
raise TypeError(msg)
|
56
|
+
|
57
|
+
trace_type = "retriever"
|
58
|
+
|
59
|
+
inputs = [
|
60
|
+
HandleInput(
|
61
|
+
name="ingest_data",
|
62
|
+
display_name="Ingest Data",
|
63
|
+
input_types=["Data", "DataFrame"],
|
64
|
+
is_list=True,
|
65
|
+
),
|
66
|
+
QueryInput(
|
67
|
+
name="search_query",
|
68
|
+
display_name="Search Query",
|
69
|
+
info="Enter a query to run a similarity search.",
|
70
|
+
placeholder="Enter a query...",
|
71
|
+
tool_mode=True,
|
72
|
+
),
|
73
|
+
BoolInput(
|
74
|
+
name="should_cache_vector_store",
|
75
|
+
display_name="Cache Vector Store",
|
76
|
+
value=True,
|
77
|
+
advanced=True,
|
78
|
+
info="If True, the vector store will be cached for the current build of the component. "
|
79
|
+
"This is useful for components that have multiple output methods and want to share the same vector store.",
|
80
|
+
),
|
81
|
+
]
|
82
|
+
|
83
|
+
outputs = [
|
84
|
+
Output(
|
85
|
+
display_name="Search Results",
|
86
|
+
name="search_results",
|
87
|
+
method="search_documents",
|
88
|
+
),
|
89
|
+
Output(display_name="DataFrame", name="dataframe", method="as_dataframe"),
|
90
|
+
]
|
91
|
+
|
92
|
+
def _validate_outputs(self) -> None:
|
93
|
+
# At least these three outputs must be defined
|
94
|
+
required_output_methods = [
|
95
|
+
"search_documents",
|
96
|
+
"build_vector_store",
|
97
|
+
]
|
98
|
+
output_names = [output.name for output in self.outputs]
|
99
|
+
for method_name in required_output_methods:
|
100
|
+
if method_name not in output_names:
|
101
|
+
msg = f"Output with name '{method_name}' must be defined."
|
102
|
+
raise ValueError(msg)
|
103
|
+
if not hasattr(self, method_name):
|
104
|
+
msg = f"Method '{method_name}' must be defined."
|
105
|
+
raise ValueError(msg)
|
106
|
+
|
107
|
+
def _prepare_ingest_data(self) -> list[Any]:
|
108
|
+
"""Prepares ingest_data by converting DataFrame to Data if needed."""
|
109
|
+
ingest_data: list | Data | DataFrame = self.ingest_data
|
110
|
+
if not ingest_data:
|
111
|
+
return []
|
112
|
+
|
113
|
+
if not isinstance(ingest_data, list):
|
114
|
+
ingest_data = [ingest_data]
|
115
|
+
|
116
|
+
result = []
|
117
|
+
|
118
|
+
for _input in ingest_data:
|
119
|
+
if isinstance(_input, DataFrame):
|
120
|
+
result.extend(_input.to_data_list())
|
121
|
+
else:
|
122
|
+
result.append(_input)
|
123
|
+
return result
|
124
|
+
|
125
|
+
def search_with_vector_store(
|
126
|
+
self,
|
127
|
+
input_value: Text,
|
128
|
+
search_type: str,
|
129
|
+
vector_store: VectorStore,
|
130
|
+
k=10,
|
131
|
+
**kwargs,
|
132
|
+
) -> list[Data]:
|
133
|
+
"""Search for data in the vector store based on the input value and search type.
|
134
|
+
|
135
|
+
Args:
|
136
|
+
input_value (Text): The input value to search for.
|
137
|
+
search_type (str): The type of search to perform.
|
138
|
+
vector_store (VectorStore): The vector store to search in.
|
139
|
+
k (int): The number of results to return.
|
140
|
+
**kwargs: Additional keyword arguments to pass to the vector store search method.
|
141
|
+
|
142
|
+
Returns:
|
143
|
+
List[Data]: A list of data matching the search criteria.
|
144
|
+
|
145
|
+
Raises:
|
146
|
+
ValueError: If invalid inputs are provided.
|
147
|
+
"""
|
148
|
+
docs: list[Document] = []
|
149
|
+
if input_value and isinstance(input_value, str) and hasattr(vector_store, "search"):
|
150
|
+
docs = vector_store.search(query=input_value, search_type=search_type.lower(), k=k, **kwargs)
|
151
|
+
else:
|
152
|
+
msg = "Invalid inputs provided."
|
153
|
+
raise ValueError(msg)
|
154
|
+
data = docs_to_data(docs)
|
155
|
+
self.status = data
|
156
|
+
return data
|
157
|
+
|
158
|
+
def search_documents(self) -> list[Data]:
|
159
|
+
"""Search for documents in the vector store."""
|
160
|
+
if self._cached_vector_store is not None:
|
161
|
+
vector_store = self._cached_vector_store
|
162
|
+
else:
|
163
|
+
vector_store = self.build_vector_store()
|
164
|
+
self._cached_vector_store = vector_store
|
165
|
+
|
166
|
+
search_query: str = self.search_query
|
167
|
+
if not search_query:
|
168
|
+
self.status = ""
|
169
|
+
return []
|
170
|
+
|
171
|
+
self.log(f"Search input: {search_query}")
|
172
|
+
self.log(f"Search type: {self.search_type}")
|
173
|
+
self.log(f"Number of results: {self.number_of_results}")
|
174
|
+
|
175
|
+
search_results = self.search_with_vector_store(
|
176
|
+
search_query, self.search_type, vector_store, k=self.number_of_results
|
177
|
+
)
|
178
|
+
self.status = search_results
|
179
|
+
return search_results
|
180
|
+
|
181
|
+
def as_dataframe(self) -> DataFrame:
|
182
|
+
return DataFrame(self.search_documents())
|
183
|
+
|
184
|
+
def get_retriever_kwargs(self):
|
185
|
+
"""Get the retriever kwargs. Implementations can override this method to provide custom retriever kwargs."""
|
186
|
+
return {}
|
187
|
+
|
188
|
+
@abstractmethod
|
189
|
+
@check_cached_vector_store
|
190
|
+
def build_vector_store(self) -> VectorStore:
|
191
|
+
"""Builds the Vector Store object."""
|
192
|
+
msg = "build_vector_store method must be implemented."
|
193
|
+
raise NotImplementedError(msg)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
from lfx.schema.data import Data
|
2
|
+
|
3
|
+
|
4
|
+
def chroma_collection_to_data(collection_dict: dict):
|
5
|
+
"""Converts a collection of chroma vectors into a list of data.
|
6
|
+
|
7
|
+
Args:
|
8
|
+
collection_dict (dict): A dictionary containing the collection of chroma vectors.
|
9
|
+
|
10
|
+
Returns:
|
11
|
+
list: A list of data, where each record represents a document in the collection.
|
12
|
+
"""
|
13
|
+
data = []
|
14
|
+
for i, doc in enumerate(collection_dict["documents"]):
|
15
|
+
data_dict = {
|
16
|
+
"id": collection_dict["ids"][i],
|
17
|
+
"text": doc,
|
18
|
+
}
|
19
|
+
if ("metadatas" in collection_dict) and collection_dict["metadatas"][i]:
|
20
|
+
data_dict.update(collection_dict["metadatas"][i].items())
|
21
|
+
data.append(Data(**data_dict))
|
22
|
+
return data
|
@@ -0,0 +1,52 @@
|
|
1
|
+
from langchain_core.vectorstores import VectorStore
|
2
|
+
|
3
|
+
from lfx.io import Output
|
4
|
+
|
5
|
+
|
6
|
+
def vector_store_connection(cls):
|
7
|
+
"""A decorator that adds vector store connection functionality to a class.
|
8
|
+
|
9
|
+
This decorator performs the following actions:
|
10
|
+
1. Adds a `decorated` attribute to the class and sets it to True.
|
11
|
+
2. Checks if the class has an `outputs` attribute:
|
12
|
+
- If it does, it makes a copy of the `outputs` attribute to avoid modifying the base class attribute.
|
13
|
+
- It then checks if "vectorstoreconnection" is not already in the output names.
|
14
|
+
- If not, it adds a new `Output` entry for "Vector Store Connection" to the `outputs` attribute.
|
15
|
+
3. Adds an `as_vector_store` method to the class, which returns the result of the `build_vector_store` method.
|
16
|
+
|
17
|
+
Args:
|
18
|
+
cls (type): The class to be decorated.
|
19
|
+
|
20
|
+
Returns:
|
21
|
+
type: The decorated class with added vector store connection functionality.
|
22
|
+
"""
|
23
|
+
cls.decorated = True # Add an attribute to the class
|
24
|
+
|
25
|
+
if hasattr(cls, "outputs"):
|
26
|
+
cls.outputs = cls.outputs.copy() # Make a copy to avoid modifying the base class attribute
|
27
|
+
output_names = [output.name for output in cls.outputs]
|
28
|
+
|
29
|
+
if "vectorstoreconnection" not in output_names:
|
30
|
+
cls.outputs.extend(
|
31
|
+
[
|
32
|
+
Output(
|
33
|
+
display_name="Vector Store Connection",
|
34
|
+
hidden=True,
|
35
|
+
name="vectorstoreconnection",
|
36
|
+
method="as_vector_store",
|
37
|
+
group_outputs=False,
|
38
|
+
)
|
39
|
+
]
|
40
|
+
)
|
41
|
+
|
42
|
+
def as_vector_store(self) -> VectorStore:
|
43
|
+
"""Converts the current instance to a VectorStore object.
|
44
|
+
|
45
|
+
Returns:
|
46
|
+
VectorStore: The resulting VectorStore object.
|
47
|
+
"""
|
48
|
+
return self.build_vector_store()
|
49
|
+
|
50
|
+
cls.as_vector_store = as_vector_store # Ensures that the method is added to the class
|
51
|
+
|
52
|
+
return cls
|