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,88 @@
|
|
|
1
|
+
from typing import cast
|
|
2
|
+
|
|
3
|
+
from lfx.custom import Component
|
|
4
|
+
from lfx.io import BoolInput, HandleInput, Output, StrInput
|
|
5
|
+
from lfx.schema.data import Data
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class NotifyComponent(Component):
|
|
9
|
+
display_name = "Notify"
|
|
10
|
+
description = "A component to generate a notification to Get Notified component."
|
|
11
|
+
icon = "Notify"
|
|
12
|
+
name = "Notify"
|
|
13
|
+
beta: bool = True
|
|
14
|
+
|
|
15
|
+
inputs = [
|
|
16
|
+
StrInput(
|
|
17
|
+
name="context_key",
|
|
18
|
+
display_name="Context Key",
|
|
19
|
+
info="The key of the context to store the notification.",
|
|
20
|
+
required=True,
|
|
21
|
+
),
|
|
22
|
+
HandleInput(
|
|
23
|
+
name="input_value",
|
|
24
|
+
display_name="Input Data",
|
|
25
|
+
info="The data to store.",
|
|
26
|
+
required=False,
|
|
27
|
+
input_types=["Data", "Message", "DataFrame"],
|
|
28
|
+
),
|
|
29
|
+
BoolInput(
|
|
30
|
+
name="append",
|
|
31
|
+
display_name="Append",
|
|
32
|
+
info="If True, the record will be appended to the notification.",
|
|
33
|
+
value=False,
|
|
34
|
+
required=False,
|
|
35
|
+
),
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
outputs = [
|
|
39
|
+
Output(
|
|
40
|
+
display_name="Data",
|
|
41
|
+
name="result",
|
|
42
|
+
method="notify_components",
|
|
43
|
+
cache=False,
|
|
44
|
+
),
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
async def notify_components(self) -> Data:
|
|
48
|
+
"""Processes and stores a notification in the component's context.
|
|
49
|
+
|
|
50
|
+
Normalizes the input value to a `Data` object and stores it under the
|
|
51
|
+
specified context key. If `append` is True, adds the value to a list
|
|
52
|
+
of notifications; otherwise, replaces the existing value. Updates the
|
|
53
|
+
component's status and activates related state vertices in the graph.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
The processed `Data` object stored in the context.
|
|
57
|
+
|
|
58
|
+
Raises:
|
|
59
|
+
ValueError: If the component is not part of a graph.
|
|
60
|
+
"""
|
|
61
|
+
if not self._vertex:
|
|
62
|
+
msg = "Notify component must be used in a graph."
|
|
63
|
+
raise ValueError(msg)
|
|
64
|
+
input_value: Data | str | dict | None = self.input_value
|
|
65
|
+
if input_value is None:
|
|
66
|
+
input_value = Data(text="")
|
|
67
|
+
elif not isinstance(input_value, Data):
|
|
68
|
+
if isinstance(input_value, str):
|
|
69
|
+
input_value = Data(text=input_value)
|
|
70
|
+
elif isinstance(input_value, dict):
|
|
71
|
+
input_value = Data(data=input_value)
|
|
72
|
+
else:
|
|
73
|
+
input_value = Data(text=str(input_value))
|
|
74
|
+
if input_value:
|
|
75
|
+
if self.append:
|
|
76
|
+
current_data = self.ctx.get(self.context_key, [])
|
|
77
|
+
if not isinstance(current_data, list):
|
|
78
|
+
current_data = [current_data]
|
|
79
|
+
current_data.append(input_value)
|
|
80
|
+
self.update_ctx({self.context_key: current_data})
|
|
81
|
+
else:
|
|
82
|
+
self.update_ctx({self.context_key: input_value})
|
|
83
|
+
self.status = input_value
|
|
84
|
+
else:
|
|
85
|
+
self.status = "No record provided."
|
|
86
|
+
self._vertex.is_state = True
|
|
87
|
+
self.graph.activate_state_vertices(name=self.context_key, caller=self._id)
|
|
88
|
+
return cast("Data", input_value)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
from lfx.io import MessageInput
|
|
3
|
+
from lfx.schema.message import Message
|
|
4
|
+
from lfx.template.field.base import Output
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class PassMessageComponent(Component):
|
|
8
|
+
display_name = "Pass"
|
|
9
|
+
description = "Forwards the input message, unchanged."
|
|
10
|
+
name = "Pass"
|
|
11
|
+
icon = "arrow-right"
|
|
12
|
+
legacy: bool = True
|
|
13
|
+
replacement = ["logic.ConditionalRouter"]
|
|
14
|
+
|
|
15
|
+
inputs = [
|
|
16
|
+
MessageInput(
|
|
17
|
+
name="input_message",
|
|
18
|
+
display_name="Input Message",
|
|
19
|
+
info="The message to be passed forward.",
|
|
20
|
+
required=True,
|
|
21
|
+
),
|
|
22
|
+
MessageInput(
|
|
23
|
+
name="ignored_message",
|
|
24
|
+
display_name="Ignored Message",
|
|
25
|
+
info="A second message to be ignored. Used as a workaround for continuity.",
|
|
26
|
+
advanced=True,
|
|
27
|
+
),
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
outputs = [
|
|
31
|
+
Output(display_name="Output Message", name="output_message", method="pass_message"),
|
|
32
|
+
]
|
|
33
|
+
|
|
34
|
+
def pass_message(self) -> Message:
|
|
35
|
+
self.status = self.input_message
|
|
36
|
+
return self.input_message
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
from lfx.base.tools.run_flow import RunFlowBaseComponent
|
|
5
|
+
from lfx.log.logger import logger
|
|
6
|
+
from lfx.schema.data import Data
|
|
7
|
+
from lfx.schema.dotdict import dotdict
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class RunFlowComponent(RunFlowBaseComponent):
|
|
11
|
+
display_name = "Run Flow"
|
|
12
|
+
description = (
|
|
13
|
+
"Executes another flow from within the same project. Can also be used as a tool for agents."
|
|
14
|
+
" \n **Select a Flow to use the tool mode**"
|
|
15
|
+
)
|
|
16
|
+
documentation: str = "https://docs.langflow.org/run-flow"
|
|
17
|
+
beta = True
|
|
18
|
+
name = "RunFlow"
|
|
19
|
+
icon = "Workflow"
|
|
20
|
+
|
|
21
|
+
inputs = RunFlowBaseComponent.get_base_inputs()
|
|
22
|
+
outputs = RunFlowBaseComponent.get_base_outputs()
|
|
23
|
+
|
|
24
|
+
async def update_build_config(
|
|
25
|
+
self,
|
|
26
|
+
build_config: dotdict,
|
|
27
|
+
field_value: Any,
|
|
28
|
+
field_name: str | None = None,
|
|
29
|
+
):
|
|
30
|
+
missing_keys = [key for key in self.default_keys if key not in build_config]
|
|
31
|
+
for key in missing_keys:
|
|
32
|
+
if key == "flow_name_selected":
|
|
33
|
+
build_config[key] = {"options": [], "options_metadata": [], "value": None}
|
|
34
|
+
elif key == "flow_id_selected":
|
|
35
|
+
build_config[key] = {"value": None}
|
|
36
|
+
elif key == "cache_flow":
|
|
37
|
+
build_config[key] = {"value": False}
|
|
38
|
+
else:
|
|
39
|
+
build_config[key] = {}
|
|
40
|
+
if field_name == "flow_name_selected" and (build_config.get("is_refresh", False) or field_value is None):
|
|
41
|
+
# refresh button was clicked or componented was initialized, so list the flows
|
|
42
|
+
options: list[str] = await self.alist_flows_by_flow_folder()
|
|
43
|
+
build_config["flow_name_selected"]["options"] = [flow.data["name"] for flow in options]
|
|
44
|
+
build_config["flow_name_selected"]["options_metadata"] = []
|
|
45
|
+
for flow in options:
|
|
46
|
+
# populate options_metadata
|
|
47
|
+
build_config["flow_name_selected"]["options_metadata"].append(
|
|
48
|
+
{"id": flow.data["id"], "updated_at": flow.data["updated_at"]}
|
|
49
|
+
)
|
|
50
|
+
# update selected flow if it is stale
|
|
51
|
+
if str(flow.data["id"]) == self.flow_id_selected:
|
|
52
|
+
await self.check_and_update_stale_flow(flow, build_config)
|
|
53
|
+
elif field_name in {"flow_name_selected", "flow_id_selected"} and field_value is not None:
|
|
54
|
+
# flow was selected by name or id, so get the flow and update the bcfg
|
|
55
|
+
try:
|
|
56
|
+
# derive flow id if the field_name is flow_name_selected
|
|
57
|
+
build_config["flow_id_selected"]["value"] = (
|
|
58
|
+
self.get_selected_flow_meta(build_config, "id") or build_config["flow_id_selected"]["value"]
|
|
59
|
+
)
|
|
60
|
+
updated_at = self.get_selected_flow_meta(build_config, "updated_at")
|
|
61
|
+
await self.load_graph_and_update_cfg(
|
|
62
|
+
build_config, build_config["flow_id_selected"]["value"], updated_at
|
|
63
|
+
)
|
|
64
|
+
except Exception as e:
|
|
65
|
+
msg = f"Error building graph for flow {field_value}"
|
|
66
|
+
await logger.aexception(msg)
|
|
67
|
+
raise RuntimeError(msg) from e
|
|
68
|
+
|
|
69
|
+
return build_config
|
|
70
|
+
|
|
71
|
+
def get_selected_flow_meta(self, build_config: dotdict, field: str) -> dict:
|
|
72
|
+
"""Get the selected flow's metadata from the build config."""
|
|
73
|
+
return build_config.get("flow_name_selected", {}).get("selected_metadata", {}).get(field)
|
|
74
|
+
|
|
75
|
+
async def load_graph_and_update_cfg(
|
|
76
|
+
self,
|
|
77
|
+
build_config: dotdict,
|
|
78
|
+
flow_id: str,
|
|
79
|
+
updated_at: str | datetime,
|
|
80
|
+
) -> None:
|
|
81
|
+
"""Load a flow's graph and update the build config."""
|
|
82
|
+
graph = await self.get_graph(
|
|
83
|
+
flow_id_selected=flow_id,
|
|
84
|
+
updated_at=self.get_str_isots(updated_at),
|
|
85
|
+
)
|
|
86
|
+
self.update_build_config_from_graph(build_config, graph)
|
|
87
|
+
|
|
88
|
+
def should_update_stale_flow(self, flow: Data, build_config: dotdict) -> bool:
|
|
89
|
+
"""Check if the flow should be updated."""
|
|
90
|
+
return (
|
|
91
|
+
(updated_at := self.get_str_isots(flow.data["updated_at"])) # true updated_at date just fetched from db
|
|
92
|
+
and (stale_at := self.get_selected_flow_meta(build_config, "updated_at")) # outdated date in bcfg
|
|
93
|
+
and self._parse_timestamp(updated_at) > self._parse_timestamp(stale_at) # stale flow condition
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
async def check_and_update_stale_flow(self, flow: Data, build_config: dotdict) -> None:
|
|
97
|
+
"""Check if the flow should be updated and update it if necessary."""
|
|
98
|
+
# TODO: improve contract/return value
|
|
99
|
+
if self.should_update_stale_flow(flow, build_config):
|
|
100
|
+
await self.load_graph_and_update_cfg(
|
|
101
|
+
build_config,
|
|
102
|
+
flow.data["id"],
|
|
103
|
+
flow.data["updated_at"],
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
def get_str_isots(self, date: datetime | str) -> str:
|
|
107
|
+
"""Get a string timestamp from a datetime or string."""
|
|
108
|
+
return date.isoformat() if hasattr(date, "isoformat") else date
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from lfx.base.flow_processing.utils import build_data_from_result_data
|
|
4
|
+
from lfx.custom.custom_component.component import Component
|
|
5
|
+
from lfx.graph.graph.base import Graph
|
|
6
|
+
from lfx.graph.vertex.base import Vertex
|
|
7
|
+
from lfx.helpers import get_flow_inputs
|
|
8
|
+
from lfx.io import DropdownInput, Output
|
|
9
|
+
from lfx.log.logger import logger
|
|
10
|
+
from lfx.schema.data import Data
|
|
11
|
+
from lfx.schema.dotdict import dotdict
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class SubFlowComponent(Component):
|
|
15
|
+
display_name = "Sub Flow"
|
|
16
|
+
description = "Generates a Component from a Flow, with all of its inputs, and "
|
|
17
|
+
name = "SubFlow"
|
|
18
|
+
legacy: bool = True
|
|
19
|
+
replacement = ["logic.RunFlow"]
|
|
20
|
+
icon = "Workflow"
|
|
21
|
+
|
|
22
|
+
async def get_flow_names(self) -> list[str]:
|
|
23
|
+
flow_data = await self.alist_flows()
|
|
24
|
+
return [flow_data.data["name"] for flow_data in flow_data]
|
|
25
|
+
|
|
26
|
+
async def get_flow(self, flow_name: str) -> Data | None:
|
|
27
|
+
flow_datas = await self.alist_flows()
|
|
28
|
+
for flow_data in flow_datas:
|
|
29
|
+
if flow_data.data["name"] == flow_name:
|
|
30
|
+
return flow_data
|
|
31
|
+
return None
|
|
32
|
+
|
|
33
|
+
async def update_build_config(self, build_config: dotdict, field_value: Any, field_name: str | None = None):
|
|
34
|
+
if field_name == "flow_name":
|
|
35
|
+
build_config["flow_name"]["options"] = await self.get_flow_names()
|
|
36
|
+
|
|
37
|
+
for key in list(build_config.keys()):
|
|
38
|
+
if key not in [x.name for x in self.inputs] + ["code", "_type", "get_final_results_only"]:
|
|
39
|
+
del build_config[key]
|
|
40
|
+
if field_value is not None and field_name == "flow_name":
|
|
41
|
+
try:
|
|
42
|
+
flow_data = await self.get_flow(field_value)
|
|
43
|
+
except Exception: # noqa: BLE001
|
|
44
|
+
await logger.aexception(f"Error getting flow {field_value}")
|
|
45
|
+
else:
|
|
46
|
+
if not flow_data:
|
|
47
|
+
msg = f"Flow {field_value} not found."
|
|
48
|
+
await logger.aerror(msg)
|
|
49
|
+
else:
|
|
50
|
+
try:
|
|
51
|
+
graph = Graph.from_payload(flow_data.data["data"])
|
|
52
|
+
# Get all inputs from the graph
|
|
53
|
+
inputs = get_flow_inputs(graph)
|
|
54
|
+
# Add inputs to the build config
|
|
55
|
+
build_config = self.add_inputs_to_build_config(inputs, build_config)
|
|
56
|
+
except Exception: # noqa: BLE001
|
|
57
|
+
await logger.aexception(f"Error building graph for flow {field_value}")
|
|
58
|
+
|
|
59
|
+
return build_config
|
|
60
|
+
|
|
61
|
+
def add_inputs_to_build_config(self, inputs_vertex: list[Vertex], build_config: dotdict):
|
|
62
|
+
new_fields: list[dotdict] = []
|
|
63
|
+
|
|
64
|
+
for vertex in inputs_vertex:
|
|
65
|
+
new_vertex_inputs = []
|
|
66
|
+
field_template = vertex.data["node"]["template"]
|
|
67
|
+
for inp in field_template:
|
|
68
|
+
if inp not in {"code", "_type"}:
|
|
69
|
+
field_template[inp]["display_name"] = (
|
|
70
|
+
vertex.display_name + " - " + field_template[inp]["display_name"]
|
|
71
|
+
)
|
|
72
|
+
field_template[inp]["name"] = vertex.id + "|" + inp
|
|
73
|
+
new_vertex_inputs.append(field_template[inp])
|
|
74
|
+
new_fields += new_vertex_inputs
|
|
75
|
+
for field in new_fields:
|
|
76
|
+
build_config[field["name"]] = field
|
|
77
|
+
return build_config
|
|
78
|
+
|
|
79
|
+
inputs = [
|
|
80
|
+
DropdownInput(
|
|
81
|
+
name="flow_name",
|
|
82
|
+
display_name="Flow Name",
|
|
83
|
+
info="The name of the flow to run.",
|
|
84
|
+
options=[],
|
|
85
|
+
refresh_button=True,
|
|
86
|
+
real_time_refresh=True,
|
|
87
|
+
),
|
|
88
|
+
]
|
|
89
|
+
|
|
90
|
+
outputs = [Output(name="flow_outputs", display_name="Flow Outputs", method="generate_results")]
|
|
91
|
+
|
|
92
|
+
async def generate_results(self) -> list[Data]:
|
|
93
|
+
tweaks: dict = {}
|
|
94
|
+
for field in self._attributes:
|
|
95
|
+
if field != "flow_name" and "|" in field:
|
|
96
|
+
[node, name] = field.split("|")
|
|
97
|
+
if node not in tweaks:
|
|
98
|
+
tweaks[node] = {}
|
|
99
|
+
tweaks[node][name] = self._attributes[field]
|
|
100
|
+
flow_name = self._attributes.get("flow_name")
|
|
101
|
+
run_outputs = await self.run_flow(
|
|
102
|
+
tweaks=tweaks,
|
|
103
|
+
flow_name=flow_name,
|
|
104
|
+
output_type="all",
|
|
105
|
+
)
|
|
106
|
+
data: list[Data] = []
|
|
107
|
+
if not run_outputs:
|
|
108
|
+
return data
|
|
109
|
+
run_output = run_outputs[0]
|
|
110
|
+
|
|
111
|
+
if run_output is not None:
|
|
112
|
+
for output in run_output.outputs:
|
|
113
|
+
if output:
|
|
114
|
+
data.extend(build_data_from_result_data(output))
|
|
115
|
+
return data
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import tempfile
|
|
3
|
+
from contextlib import asynccontextmanager
|
|
4
|
+
from fnmatch import fnmatch
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
import anyio
|
|
8
|
+
from langchain_community.document_loaders.git import GitLoader
|
|
9
|
+
|
|
10
|
+
from lfx.custom.custom_component.component import Component
|
|
11
|
+
from lfx.io import DropdownInput, MessageTextInput, Output
|
|
12
|
+
from lfx.schema.data import Data
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class GitLoaderComponent(Component):
|
|
16
|
+
display_name = "Git"
|
|
17
|
+
description = (
|
|
18
|
+
"Load and filter documents from a local or remote Git repository. "
|
|
19
|
+
"Use a local repo path or clone from a remote URL."
|
|
20
|
+
)
|
|
21
|
+
trace_type = "tool"
|
|
22
|
+
icon = "GitLoader"
|
|
23
|
+
|
|
24
|
+
inputs = [
|
|
25
|
+
DropdownInput(
|
|
26
|
+
name="repo_source",
|
|
27
|
+
display_name="Repository Source",
|
|
28
|
+
options=["Local", "Remote"],
|
|
29
|
+
required=True,
|
|
30
|
+
info="Select whether to use a local repo path or clone from a remote URL.",
|
|
31
|
+
real_time_refresh=True,
|
|
32
|
+
),
|
|
33
|
+
MessageTextInput(
|
|
34
|
+
name="repo_path",
|
|
35
|
+
display_name="Local Repository Path",
|
|
36
|
+
required=False,
|
|
37
|
+
info="The local path to the existing Git repository (used if 'Local' is selected).",
|
|
38
|
+
dynamic=True,
|
|
39
|
+
show=False,
|
|
40
|
+
),
|
|
41
|
+
MessageTextInput(
|
|
42
|
+
name="clone_url",
|
|
43
|
+
display_name="Clone URL",
|
|
44
|
+
required=False,
|
|
45
|
+
info="The URL of the Git repository to clone (used if 'Clone' is selected).",
|
|
46
|
+
dynamic=True,
|
|
47
|
+
show=False,
|
|
48
|
+
),
|
|
49
|
+
MessageTextInput(
|
|
50
|
+
name="branch",
|
|
51
|
+
display_name="Branch",
|
|
52
|
+
required=False,
|
|
53
|
+
value="main",
|
|
54
|
+
info="The branch to load files from. Defaults to 'main'.",
|
|
55
|
+
),
|
|
56
|
+
MessageTextInput(
|
|
57
|
+
name="file_filter",
|
|
58
|
+
display_name="File Filter",
|
|
59
|
+
required=False,
|
|
60
|
+
advanced=True,
|
|
61
|
+
info=(
|
|
62
|
+
"Patterns to filter files. For example:\n"
|
|
63
|
+
"Include only .py files: '*.py'\n"
|
|
64
|
+
"Exclude .py files: '!*.py'\n"
|
|
65
|
+
"Multiple patterns can be separated by commas."
|
|
66
|
+
),
|
|
67
|
+
),
|
|
68
|
+
MessageTextInput(
|
|
69
|
+
name="content_filter",
|
|
70
|
+
display_name="Content Filter",
|
|
71
|
+
required=False,
|
|
72
|
+
advanced=True,
|
|
73
|
+
info="A regex pattern to filter files based on their content.",
|
|
74
|
+
),
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
outputs = [
|
|
78
|
+
Output(name="data", display_name="Data", method="load_documents"),
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
@staticmethod
|
|
82
|
+
def is_binary(file_path: str | Path) -> bool:
|
|
83
|
+
"""Check if a file is binary by looking for null bytes."""
|
|
84
|
+
try:
|
|
85
|
+
with Path(file_path).open("rb") as file:
|
|
86
|
+
content = file.read(1024)
|
|
87
|
+
return b"\x00" in content
|
|
88
|
+
except Exception: # noqa: BLE001
|
|
89
|
+
return True
|
|
90
|
+
|
|
91
|
+
@staticmethod
|
|
92
|
+
def check_file_patterns(file_path: str | Path, patterns: str) -> bool:
|
|
93
|
+
"""Check if a file matches the given patterns.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
file_path: Path to the file to check
|
|
97
|
+
patterns: Comma-separated list of glob patterns
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
bool: True if file should be included, False if excluded
|
|
101
|
+
"""
|
|
102
|
+
# Handle empty or whitespace-only patterns
|
|
103
|
+
if not patterns or patterns.isspace():
|
|
104
|
+
return True
|
|
105
|
+
|
|
106
|
+
path_str = str(file_path)
|
|
107
|
+
file_name = Path(path_str).name
|
|
108
|
+
pattern_list: list[str] = [pattern.strip() for pattern in patterns.split(",") if pattern.strip()]
|
|
109
|
+
|
|
110
|
+
# If no valid patterns after stripping, treat as include all
|
|
111
|
+
if not pattern_list:
|
|
112
|
+
return True
|
|
113
|
+
|
|
114
|
+
# Process exclusion patterns first
|
|
115
|
+
for pattern in pattern_list:
|
|
116
|
+
if pattern.startswith("!"):
|
|
117
|
+
# For exclusions, match against both full path and filename
|
|
118
|
+
exclude_pattern = pattern[1:]
|
|
119
|
+
if fnmatch(path_str, exclude_pattern) or fnmatch(file_name, exclude_pattern):
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
# Then check inclusion patterns
|
|
123
|
+
include_patterns = [p for p in pattern_list if not p.startswith("!")]
|
|
124
|
+
# If no include patterns, treat as include all
|
|
125
|
+
if not include_patterns:
|
|
126
|
+
return True
|
|
127
|
+
|
|
128
|
+
# For inclusions, match against both full path and filename
|
|
129
|
+
return any(fnmatch(path_str, pattern) or fnmatch(file_name, pattern) for pattern in include_patterns)
|
|
130
|
+
|
|
131
|
+
@staticmethod
|
|
132
|
+
def check_content_pattern(file_path: str | Path, pattern: str) -> bool:
|
|
133
|
+
"""Check if file content matches the given regex pattern.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
file_path: Path to the file to check
|
|
137
|
+
pattern: Regex pattern to match against content
|
|
138
|
+
|
|
139
|
+
Returns:
|
|
140
|
+
bool: True if content matches, False otherwise
|
|
141
|
+
"""
|
|
142
|
+
try:
|
|
143
|
+
# Check if file is binary
|
|
144
|
+
with Path(file_path).open("rb") as file:
|
|
145
|
+
content = file.read(1024)
|
|
146
|
+
if b"\x00" in content:
|
|
147
|
+
return False
|
|
148
|
+
|
|
149
|
+
# Try to compile the regex pattern first
|
|
150
|
+
try:
|
|
151
|
+
# Use the MULTILINE flag to better handle text content
|
|
152
|
+
content_regex = re.compile(pattern, re.MULTILINE)
|
|
153
|
+
# Test the pattern with a simple string to catch syntax errors
|
|
154
|
+
test_str = "test\nstring"
|
|
155
|
+
if not content_regex.search(test_str):
|
|
156
|
+
# Pattern is valid but doesn't match test string
|
|
157
|
+
pass
|
|
158
|
+
except (re.error, TypeError, ValueError):
|
|
159
|
+
return False
|
|
160
|
+
|
|
161
|
+
# If not binary and regex is valid, check content
|
|
162
|
+
with Path(file_path).open(encoding="utf-8") as file:
|
|
163
|
+
file_content = file.read()
|
|
164
|
+
return bool(content_regex.search(file_content))
|
|
165
|
+
except (OSError, UnicodeDecodeError):
|
|
166
|
+
return False
|
|
167
|
+
|
|
168
|
+
def build_combined_filter(self, file_filter_patterns: str | None = None, content_filter_pattern: str | None = None):
|
|
169
|
+
"""Build a combined filter function from file and content patterns.
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
file_filter_patterns: Comma-separated glob patterns
|
|
173
|
+
content_filter_pattern: Regex pattern for content
|
|
174
|
+
|
|
175
|
+
Returns:
|
|
176
|
+
callable: Filter function that takes a file path and returns bool
|
|
177
|
+
"""
|
|
178
|
+
|
|
179
|
+
def combined_filter(file_path: str) -> bool:
|
|
180
|
+
try:
|
|
181
|
+
path = Path(file_path)
|
|
182
|
+
|
|
183
|
+
# Check if file exists and is readable
|
|
184
|
+
if not path.exists():
|
|
185
|
+
return False
|
|
186
|
+
|
|
187
|
+
# Check if file is binary
|
|
188
|
+
if self.is_binary(path):
|
|
189
|
+
return False
|
|
190
|
+
|
|
191
|
+
# Apply file pattern filters
|
|
192
|
+
if file_filter_patterns and not self.check_file_patterns(path, file_filter_patterns):
|
|
193
|
+
return False
|
|
194
|
+
|
|
195
|
+
# Apply content filter
|
|
196
|
+
return not (content_filter_pattern and not self.check_content_pattern(path, content_filter_pattern))
|
|
197
|
+
except Exception: # noqa: BLE001
|
|
198
|
+
return False
|
|
199
|
+
|
|
200
|
+
return combined_filter
|
|
201
|
+
|
|
202
|
+
@asynccontextmanager
|
|
203
|
+
async def temp_clone_dir(self):
|
|
204
|
+
"""Context manager for handling temporary clone directory."""
|
|
205
|
+
temp_dir = None
|
|
206
|
+
try:
|
|
207
|
+
temp_dir = tempfile.mkdtemp(prefix="langflow_clone_")
|
|
208
|
+
yield temp_dir
|
|
209
|
+
finally:
|
|
210
|
+
if temp_dir:
|
|
211
|
+
await anyio.Path(temp_dir).rmdir()
|
|
212
|
+
|
|
213
|
+
def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None) -> dict:
|
|
214
|
+
# Hide fields by default
|
|
215
|
+
build_config["repo_path"]["show"] = False
|
|
216
|
+
build_config["clone_url"]["show"] = False
|
|
217
|
+
|
|
218
|
+
if field_name == "repo_source":
|
|
219
|
+
if field_value == "Local":
|
|
220
|
+
build_config["repo_path"]["show"] = True
|
|
221
|
+
build_config["repo_path"]["required"] = True
|
|
222
|
+
build_config["clone_url"]["required"] = False
|
|
223
|
+
elif field_value == "Remote":
|
|
224
|
+
build_config["clone_url"]["show"] = True
|
|
225
|
+
build_config["clone_url"]["required"] = True
|
|
226
|
+
build_config["repo_path"]["required"] = False
|
|
227
|
+
|
|
228
|
+
return build_config
|
|
229
|
+
|
|
230
|
+
async def build_gitloader(self) -> GitLoader:
|
|
231
|
+
file_filter_patterns = getattr(self, "file_filter", None)
|
|
232
|
+
content_filter_pattern = getattr(self, "content_filter", None)
|
|
233
|
+
|
|
234
|
+
combined_filter = self.build_combined_filter(file_filter_patterns, content_filter_pattern)
|
|
235
|
+
|
|
236
|
+
repo_source = getattr(self, "repo_source", None)
|
|
237
|
+
if repo_source == "Local":
|
|
238
|
+
repo_path = self.repo_path
|
|
239
|
+
clone_url = None
|
|
240
|
+
else:
|
|
241
|
+
# Clone source
|
|
242
|
+
clone_url = self.clone_url
|
|
243
|
+
async with self.temp_clone_dir() as temp_dir:
|
|
244
|
+
repo_path = temp_dir
|
|
245
|
+
|
|
246
|
+
# Only pass branch if it's explicitly set
|
|
247
|
+
branch = getattr(self, "branch", None)
|
|
248
|
+
if not branch:
|
|
249
|
+
branch = None
|
|
250
|
+
|
|
251
|
+
return GitLoader(
|
|
252
|
+
repo_path=repo_path,
|
|
253
|
+
clone_url=clone_url if repo_source == "Remote" else None,
|
|
254
|
+
branch=branch,
|
|
255
|
+
file_filter=combined_filter,
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
async def load_documents(self) -> list[Data]:
|
|
259
|
+
gitloader = await self.build_gitloader()
|
|
260
|
+
data = [Data.from_document(doc) async for doc in gitloader.alazy_load()]
|
|
261
|
+
self.status = data
|
|
262
|
+
return data
|