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,71 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
import requests
|
|
3
|
+
from bs4 import BeautifulSoup
|
|
4
|
+
|
|
5
|
+
from lfx.custom import Component
|
|
6
|
+
from lfx.io import IntInput, MessageTextInput, Output
|
|
7
|
+
from lfx.log.logger import logger
|
|
8
|
+
from lfx.schema import DataFrame
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class RSSReaderComponent(Component):
|
|
12
|
+
display_name = "RSS Reader"
|
|
13
|
+
description = "Fetches and parses an RSS feed."
|
|
14
|
+
documentation: str = "https://docs.langflow.org/web-search"
|
|
15
|
+
icon = "rss"
|
|
16
|
+
name = "RSSReaderSimple"
|
|
17
|
+
legacy = True
|
|
18
|
+
replacement = "data.WebSearch"
|
|
19
|
+
|
|
20
|
+
inputs = [
|
|
21
|
+
MessageTextInput(
|
|
22
|
+
name="rss_url",
|
|
23
|
+
display_name="RSS Feed URL",
|
|
24
|
+
info="URL of the RSS feed to parse.",
|
|
25
|
+
tool_mode=True,
|
|
26
|
+
required=True,
|
|
27
|
+
),
|
|
28
|
+
IntInput(
|
|
29
|
+
name="timeout",
|
|
30
|
+
display_name="Timeout",
|
|
31
|
+
info="Timeout for the RSS feed request.",
|
|
32
|
+
value=5,
|
|
33
|
+
advanced=True,
|
|
34
|
+
),
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
outputs = [Output(name="articles", display_name="Articles", method="read_rss")]
|
|
38
|
+
|
|
39
|
+
def read_rss(self) -> DataFrame:
|
|
40
|
+
try:
|
|
41
|
+
response = requests.get(self.rss_url, timeout=self.timeout)
|
|
42
|
+
response.raise_for_status()
|
|
43
|
+
if not response.content.strip():
|
|
44
|
+
msg = "Empty response received"
|
|
45
|
+
raise ValueError(msg)
|
|
46
|
+
# Check if the response is valid XML
|
|
47
|
+
try:
|
|
48
|
+
BeautifulSoup(response.content, "xml")
|
|
49
|
+
except Exception as e:
|
|
50
|
+
msg = f"Invalid XML response: {e}"
|
|
51
|
+
raise ValueError(msg) from e
|
|
52
|
+
soup = BeautifulSoup(response.content, "xml")
|
|
53
|
+
items = soup.find_all("item")
|
|
54
|
+
except (requests.RequestException, ValueError) as e:
|
|
55
|
+
self.status = f"Failed to fetch RSS: {e}"
|
|
56
|
+
return DataFrame(pd.DataFrame([{"title": "Error", "link": "", "published": "", "summary": str(e)}]))
|
|
57
|
+
|
|
58
|
+
articles = [
|
|
59
|
+
{
|
|
60
|
+
"title": item.title.text if item.title else "",
|
|
61
|
+
"link": item.link.text if item.link else "",
|
|
62
|
+
"published": item.pubDate.text if item.pubDate else "",
|
|
63
|
+
"summary": item.description.text if item.description else "",
|
|
64
|
+
}
|
|
65
|
+
for item in items
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
# Ensure the DataFrame has the correct columns even if empty
|
|
69
|
+
df_articles = pd.DataFrame(articles, columns=["title", "link", "published", "summary"])
|
|
70
|
+
logger.info(f"Fetched {len(df_articles)} articles.")
|
|
71
|
+
return DataFrame(df_articles)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Any
|
|
2
|
+
|
|
3
|
+
from langchain_community.utilities import SQLDatabase
|
|
4
|
+
from sqlalchemy.exc import SQLAlchemyError
|
|
5
|
+
|
|
6
|
+
from lfx.custom.custom_component.component_with_cache import ComponentWithCache
|
|
7
|
+
from lfx.io import BoolInput, MessageTextInput, MultilineInput, Output
|
|
8
|
+
from lfx.schema.dataframe import DataFrame
|
|
9
|
+
from lfx.schema.message import Message
|
|
10
|
+
from lfx.services.cache.utils import CacheMiss
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from sqlalchemy.engine import Result
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SQLComponent(ComponentWithCache):
|
|
17
|
+
"""A sql component."""
|
|
18
|
+
|
|
19
|
+
display_name = "SQL Database"
|
|
20
|
+
description = "Executes SQL queries on SQLAlchemy-compatible databases."
|
|
21
|
+
documentation: str = "https://docs.langflow.org/sql-database"
|
|
22
|
+
icon = "database"
|
|
23
|
+
name = "SQLComponent"
|
|
24
|
+
metadata = {"keywords": ["sql", "database", "query", "db", "fetch"]}
|
|
25
|
+
|
|
26
|
+
def __init__(self, **kwargs) -> None:
|
|
27
|
+
super().__init__(**kwargs)
|
|
28
|
+
self.db: SQLDatabase = None
|
|
29
|
+
|
|
30
|
+
def maybe_create_db(self):
|
|
31
|
+
if self.database_url != "":
|
|
32
|
+
if self._shared_component_cache:
|
|
33
|
+
cached_db = self._shared_component_cache.get(self.database_url)
|
|
34
|
+
if not isinstance(cached_db, CacheMiss):
|
|
35
|
+
self.db = cached_db
|
|
36
|
+
return
|
|
37
|
+
self.log("Connecting to database")
|
|
38
|
+
try:
|
|
39
|
+
self.db = SQLDatabase.from_uri(self.database_url)
|
|
40
|
+
except Exception as e:
|
|
41
|
+
msg = f"An error occurred while connecting to the database: {e}"
|
|
42
|
+
raise ValueError(msg) from e
|
|
43
|
+
if self._shared_component_cache:
|
|
44
|
+
self._shared_component_cache.set(self.database_url, self.db)
|
|
45
|
+
|
|
46
|
+
inputs = [
|
|
47
|
+
MessageTextInput(name="database_url", display_name="Database URL", required=True),
|
|
48
|
+
MultilineInput(name="query", display_name="SQL Query", tool_mode=True, required=True),
|
|
49
|
+
BoolInput(name="include_columns", display_name="Include Columns", value=True, tool_mode=True, advanced=True),
|
|
50
|
+
BoolInput(
|
|
51
|
+
name="add_error",
|
|
52
|
+
display_name="Add Error",
|
|
53
|
+
value=False,
|
|
54
|
+
tool_mode=True,
|
|
55
|
+
info="If True, the error will be added to the result",
|
|
56
|
+
advanced=True,
|
|
57
|
+
),
|
|
58
|
+
]
|
|
59
|
+
|
|
60
|
+
outputs = [
|
|
61
|
+
Output(display_name="Result Table", name="run_sql_query", method="run_sql_query"),
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
def build_component(
|
|
65
|
+
self,
|
|
66
|
+
) -> Message:
|
|
67
|
+
error = None
|
|
68
|
+
self.maybe_create_db()
|
|
69
|
+
try:
|
|
70
|
+
result = self.db.run(self.query, include_columns=self.include_columns)
|
|
71
|
+
self.status = result
|
|
72
|
+
except SQLAlchemyError as e:
|
|
73
|
+
msg = f"An error occurred while running the SQL Query: {e}"
|
|
74
|
+
self.log(msg)
|
|
75
|
+
result = str(e)
|
|
76
|
+
self.status = result
|
|
77
|
+
error = repr(e)
|
|
78
|
+
|
|
79
|
+
if self.add_error and error is not None:
|
|
80
|
+
result = f"{result}\n\nError: {error}\n\nQuery: {self.query}"
|
|
81
|
+
elif error is not None:
|
|
82
|
+
# Then we won't add the error to the result
|
|
83
|
+
result = self.query
|
|
84
|
+
|
|
85
|
+
return Message(text=result)
|
|
86
|
+
|
|
87
|
+
def __execute_query(self) -> list[dict[str, Any]]:
|
|
88
|
+
self.maybe_create_db()
|
|
89
|
+
try:
|
|
90
|
+
cursor: Result[Any] = self.db.run(self.query, fetch="cursor")
|
|
91
|
+
return [x._asdict() for x in cursor.fetchall()]
|
|
92
|
+
except SQLAlchemyError as e:
|
|
93
|
+
msg = f"An error occurred while running the SQL Query: {e}"
|
|
94
|
+
self.log(msg)
|
|
95
|
+
raise ValueError(msg) from e
|
|
96
|
+
|
|
97
|
+
def run_sql_query(self) -> DataFrame:
|
|
98
|
+
result = self.__execute_query()
|
|
99
|
+
df_result = DataFrame(result)
|
|
100
|
+
self.status = df_result
|
|
101
|
+
return df_result
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import importlib
|
|
2
|
+
import re
|
|
3
|
+
|
|
4
|
+
import requests
|
|
5
|
+
from bs4 import BeautifulSoup
|
|
6
|
+
from langchain_community.document_loaders import RecursiveUrlLoader
|
|
7
|
+
|
|
8
|
+
from lfx.custom.custom_component.component import Component
|
|
9
|
+
from lfx.field_typing.range_spec import RangeSpec
|
|
10
|
+
from lfx.helpers.data import safe_convert
|
|
11
|
+
from lfx.io import BoolInput, DropdownInput, IntInput, MessageTextInput, Output, SliderInput, TableInput
|
|
12
|
+
from lfx.log.logger import logger
|
|
13
|
+
from lfx.schema.dataframe import DataFrame
|
|
14
|
+
from lfx.schema.message import Message
|
|
15
|
+
from lfx.utils.request_utils import get_user_agent
|
|
16
|
+
|
|
17
|
+
# Constants
|
|
18
|
+
DEFAULT_TIMEOUT = 30
|
|
19
|
+
DEFAULT_MAX_DEPTH = 1
|
|
20
|
+
DEFAULT_FORMAT = "Text"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
URL_REGEX = re.compile(
|
|
24
|
+
r"^(https?:\/\/)?" r"(www\.)?" r"([a-zA-Z0-9.-]+)" r"(\.[a-zA-Z]{2,})?" r"(:\d+)?" r"(\/[^\s]*)?$",
|
|
25
|
+
re.IGNORECASE,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
USER_AGENT = None
|
|
29
|
+
# Check if langflow is installed using importlib.util.find_spec(name))
|
|
30
|
+
if importlib.util.find_spec("langflow"):
|
|
31
|
+
langflow_installed = True
|
|
32
|
+
USER_AGENT = get_user_agent()
|
|
33
|
+
else:
|
|
34
|
+
langflow_installed = False
|
|
35
|
+
USER_AGENT = "lfx"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class URLComponent(Component):
|
|
39
|
+
"""A component that loads and parses content from web pages recursively.
|
|
40
|
+
|
|
41
|
+
This component allows fetching content from one or more URLs, with options to:
|
|
42
|
+
- Control crawl depth
|
|
43
|
+
- Prevent crawling outside the root domain
|
|
44
|
+
- Use async loading for better performance
|
|
45
|
+
- Extract either raw HTML or clean text
|
|
46
|
+
- Configure request headers and timeouts
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
display_name = "URL"
|
|
50
|
+
description = "Fetch content from one or more web pages, following links recursively."
|
|
51
|
+
documentation: str = "https://docs.langflow.org/url"
|
|
52
|
+
icon = "layout-template"
|
|
53
|
+
name = "URLComponent"
|
|
54
|
+
|
|
55
|
+
inputs = [
|
|
56
|
+
MessageTextInput(
|
|
57
|
+
name="urls",
|
|
58
|
+
display_name="URLs",
|
|
59
|
+
info="Enter one or more URLs to crawl recursively, by clicking the '+' button.",
|
|
60
|
+
is_list=True,
|
|
61
|
+
tool_mode=True,
|
|
62
|
+
placeholder="Enter a URL...",
|
|
63
|
+
list_add_label="Add URL",
|
|
64
|
+
input_types=[],
|
|
65
|
+
),
|
|
66
|
+
SliderInput(
|
|
67
|
+
name="max_depth",
|
|
68
|
+
display_name="Depth",
|
|
69
|
+
info=(
|
|
70
|
+
"Controls how many 'clicks' away from the initial page the crawler will go:\n"
|
|
71
|
+
"- depth 1: only the initial page\n"
|
|
72
|
+
"- depth 2: initial page + all pages linked directly from it\n"
|
|
73
|
+
"- depth 3: initial page + direct links + links found on those direct link pages\n"
|
|
74
|
+
"Note: This is about link traversal, not URL path depth."
|
|
75
|
+
),
|
|
76
|
+
value=DEFAULT_MAX_DEPTH,
|
|
77
|
+
range_spec=RangeSpec(min=1, max=5, step=1),
|
|
78
|
+
required=False,
|
|
79
|
+
min_label=" ",
|
|
80
|
+
max_label=" ",
|
|
81
|
+
min_label_icon="None",
|
|
82
|
+
max_label_icon="None",
|
|
83
|
+
# slider_input=True
|
|
84
|
+
),
|
|
85
|
+
BoolInput(
|
|
86
|
+
name="prevent_outside",
|
|
87
|
+
display_name="Prevent Outside",
|
|
88
|
+
info=(
|
|
89
|
+
"If enabled, only crawls URLs within the same domain as the root URL. "
|
|
90
|
+
"This helps prevent the crawler from going to external websites."
|
|
91
|
+
),
|
|
92
|
+
value=True,
|
|
93
|
+
required=False,
|
|
94
|
+
advanced=True,
|
|
95
|
+
),
|
|
96
|
+
BoolInput(
|
|
97
|
+
name="use_async",
|
|
98
|
+
display_name="Use Async",
|
|
99
|
+
info=(
|
|
100
|
+
"If enabled, uses asynchronous loading which can be significantly faster "
|
|
101
|
+
"but might use more system resources."
|
|
102
|
+
),
|
|
103
|
+
value=True,
|
|
104
|
+
required=False,
|
|
105
|
+
advanced=True,
|
|
106
|
+
),
|
|
107
|
+
DropdownInput(
|
|
108
|
+
name="format",
|
|
109
|
+
display_name="Output Format",
|
|
110
|
+
info="Output Format. Use 'Text' to extract the text from the HTML or 'HTML' for the raw HTML content.",
|
|
111
|
+
options=["Text", "HTML"],
|
|
112
|
+
value=DEFAULT_FORMAT,
|
|
113
|
+
advanced=True,
|
|
114
|
+
),
|
|
115
|
+
IntInput(
|
|
116
|
+
name="timeout",
|
|
117
|
+
display_name="Timeout",
|
|
118
|
+
info="Timeout for the request in seconds.",
|
|
119
|
+
value=DEFAULT_TIMEOUT,
|
|
120
|
+
required=False,
|
|
121
|
+
advanced=True,
|
|
122
|
+
),
|
|
123
|
+
TableInput(
|
|
124
|
+
name="headers",
|
|
125
|
+
display_name="Headers",
|
|
126
|
+
info="The headers to send with the request",
|
|
127
|
+
table_schema=[
|
|
128
|
+
{
|
|
129
|
+
"name": "key",
|
|
130
|
+
"display_name": "Header",
|
|
131
|
+
"type": "str",
|
|
132
|
+
"description": "Header name",
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"name": "value",
|
|
136
|
+
"display_name": "Value",
|
|
137
|
+
"type": "str",
|
|
138
|
+
"description": "Header value",
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
value=[{"key": "User-Agent", "value": USER_AGENT}],
|
|
142
|
+
advanced=True,
|
|
143
|
+
input_types=["DataFrame"],
|
|
144
|
+
),
|
|
145
|
+
BoolInput(
|
|
146
|
+
name="filter_text_html",
|
|
147
|
+
display_name="Filter Text/HTML",
|
|
148
|
+
info="If enabled, filters out text/css content type from the results.",
|
|
149
|
+
value=True,
|
|
150
|
+
required=False,
|
|
151
|
+
advanced=True,
|
|
152
|
+
),
|
|
153
|
+
BoolInput(
|
|
154
|
+
name="continue_on_failure",
|
|
155
|
+
display_name="Continue on Failure",
|
|
156
|
+
info="If enabled, continues crawling even if some requests fail.",
|
|
157
|
+
value=True,
|
|
158
|
+
required=False,
|
|
159
|
+
advanced=True,
|
|
160
|
+
),
|
|
161
|
+
BoolInput(
|
|
162
|
+
name="check_response_status",
|
|
163
|
+
display_name="Check Response Status",
|
|
164
|
+
info="If enabled, checks the response status of the request.",
|
|
165
|
+
value=False,
|
|
166
|
+
required=False,
|
|
167
|
+
advanced=True,
|
|
168
|
+
),
|
|
169
|
+
BoolInput(
|
|
170
|
+
name="autoset_encoding",
|
|
171
|
+
display_name="Autoset Encoding",
|
|
172
|
+
info="If enabled, automatically sets the encoding of the request.",
|
|
173
|
+
value=True,
|
|
174
|
+
required=False,
|
|
175
|
+
advanced=True,
|
|
176
|
+
),
|
|
177
|
+
]
|
|
178
|
+
|
|
179
|
+
outputs = [
|
|
180
|
+
Output(display_name="Extracted Pages", name="page_results", method="fetch_content"),
|
|
181
|
+
Output(display_name="Raw Content", name="raw_results", method="fetch_content_as_message", tool_mode=False),
|
|
182
|
+
]
|
|
183
|
+
|
|
184
|
+
@staticmethod
|
|
185
|
+
def validate_url(url: str) -> bool:
|
|
186
|
+
"""Validates if the given string matches URL pattern.
|
|
187
|
+
|
|
188
|
+
Args:
|
|
189
|
+
url: The URL string to validate
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
bool: True if the URL is valid, False otherwise
|
|
193
|
+
"""
|
|
194
|
+
return bool(URL_REGEX.match(url))
|
|
195
|
+
|
|
196
|
+
def ensure_url(self, url: str) -> str:
|
|
197
|
+
"""Ensures the given string is a valid URL.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
url: The URL string to validate and normalize
|
|
201
|
+
|
|
202
|
+
Returns:
|
|
203
|
+
str: The normalized URL
|
|
204
|
+
|
|
205
|
+
Raises:
|
|
206
|
+
ValueError: If the URL is invalid
|
|
207
|
+
"""
|
|
208
|
+
url = url.strip()
|
|
209
|
+
if not url.startswith(("http://", "https://")):
|
|
210
|
+
url = "https://" + url
|
|
211
|
+
|
|
212
|
+
if not self.validate_url(url):
|
|
213
|
+
msg = f"Invalid URL: {url}"
|
|
214
|
+
raise ValueError(msg)
|
|
215
|
+
|
|
216
|
+
return url
|
|
217
|
+
|
|
218
|
+
def _create_loader(self, url: str) -> RecursiveUrlLoader:
|
|
219
|
+
"""Creates a RecursiveUrlLoader instance with the configured settings.
|
|
220
|
+
|
|
221
|
+
Args:
|
|
222
|
+
url: The URL to load
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
RecursiveUrlLoader: Configured loader instance
|
|
226
|
+
"""
|
|
227
|
+
headers_dict = {header["key"]: header["value"] for header in self.headers if header["value"] is not None}
|
|
228
|
+
extractor = (lambda x: x) if self.format == "HTML" else (lambda x: BeautifulSoup(x, "lxml").get_text())
|
|
229
|
+
|
|
230
|
+
return RecursiveUrlLoader(
|
|
231
|
+
url=url,
|
|
232
|
+
max_depth=self.max_depth,
|
|
233
|
+
prevent_outside=self.prevent_outside,
|
|
234
|
+
use_async=self.use_async,
|
|
235
|
+
extractor=extractor,
|
|
236
|
+
timeout=self.timeout,
|
|
237
|
+
headers=headers_dict,
|
|
238
|
+
check_response_status=self.check_response_status,
|
|
239
|
+
continue_on_failure=self.continue_on_failure,
|
|
240
|
+
base_url=url, # Add base_url to ensure consistent domain crawling
|
|
241
|
+
autoset_encoding=self.autoset_encoding, # Enable automatic encoding detection
|
|
242
|
+
exclude_dirs=[], # Allow customization of excluded directories
|
|
243
|
+
link_regex=None, # Allow customization of link filtering
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
def fetch_url_contents(self) -> list[dict]:
|
|
247
|
+
"""Load documents from the configured URLs.
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
List[Data]: List of Data objects containing the fetched content
|
|
251
|
+
|
|
252
|
+
Raises:
|
|
253
|
+
ValueError: If no valid URLs are provided or if there's an error loading documents
|
|
254
|
+
"""
|
|
255
|
+
try:
|
|
256
|
+
urls = list({self.ensure_url(url) for url in self.urls if url.strip()})
|
|
257
|
+
logger.debug(f"URLs: {urls}")
|
|
258
|
+
if not urls:
|
|
259
|
+
msg = "No valid URLs provided."
|
|
260
|
+
raise ValueError(msg)
|
|
261
|
+
|
|
262
|
+
all_docs = []
|
|
263
|
+
for url in urls:
|
|
264
|
+
logger.debug(f"Loading documents from {url}")
|
|
265
|
+
|
|
266
|
+
try:
|
|
267
|
+
loader = self._create_loader(url)
|
|
268
|
+
docs = loader.load()
|
|
269
|
+
|
|
270
|
+
if not docs:
|
|
271
|
+
logger.warning(f"No documents found for {url}")
|
|
272
|
+
continue
|
|
273
|
+
|
|
274
|
+
logger.debug(f"Found {len(docs)} documents from {url}")
|
|
275
|
+
all_docs.extend(docs)
|
|
276
|
+
|
|
277
|
+
except requests.exceptions.RequestException as e:
|
|
278
|
+
logger.exception(f"Error loading documents from {url}: {e}")
|
|
279
|
+
continue
|
|
280
|
+
|
|
281
|
+
if not all_docs:
|
|
282
|
+
msg = "No documents were successfully loaded from any URL"
|
|
283
|
+
raise ValueError(msg)
|
|
284
|
+
|
|
285
|
+
# data = [Data(text=doc.page_content, **doc.metadata) for doc in all_docs]
|
|
286
|
+
data = [
|
|
287
|
+
{
|
|
288
|
+
"text": safe_convert(doc.page_content, clean_data=True),
|
|
289
|
+
"url": doc.metadata.get("source", ""),
|
|
290
|
+
"title": doc.metadata.get("title", ""),
|
|
291
|
+
"description": doc.metadata.get("description", ""),
|
|
292
|
+
"content_type": doc.metadata.get("content_type", ""),
|
|
293
|
+
"language": doc.metadata.get("language", ""),
|
|
294
|
+
}
|
|
295
|
+
for doc in all_docs
|
|
296
|
+
]
|
|
297
|
+
except Exception as e:
|
|
298
|
+
error_msg = e.message if hasattr(e, "message") else e
|
|
299
|
+
msg = f"Error loading documents: {error_msg!s}"
|
|
300
|
+
logger.exception(msg)
|
|
301
|
+
raise ValueError(msg) from e
|
|
302
|
+
return data
|
|
303
|
+
|
|
304
|
+
def fetch_content(self) -> DataFrame:
|
|
305
|
+
"""Convert the documents to a DataFrame."""
|
|
306
|
+
return DataFrame(data=self.fetch_url_contents())
|
|
307
|
+
|
|
308
|
+
def fetch_content_as_message(self) -> Message:
|
|
309
|
+
"""Convert the documents to a Message."""
|
|
310
|
+
url_contents = self.fetch_url_contents()
|
|
311
|
+
return Message(text="\n\n".join([x["text"] for x in url_contents]), data={"data": url_contents})
|