lfx-nightly 0.1.11.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +268 -0
- lfx/base/agents/callback.py +130 -0
- lfx/base/agents/context.py +109 -0
- lfx/base/agents/crewai/__init__.py +0 -0
- lfx/base/agents/crewai/crew.py +231 -0
- lfx/base/agents/crewai/tasks.py +12 -0
- lfx/base/agents/default_prompts.py +23 -0
- lfx/base/agents/errors.py +15 -0
- lfx/base/agents/events.py +346 -0
- lfx/base/agents/utils.py +205 -0
- lfx/base/astra_assistants/__init__.py +0 -0
- lfx/base/astra_assistants/util.py +171 -0
- lfx/base/chains/__init__.py +0 -0
- lfx/base/chains/model.py +19 -0
- lfx/base/composio/__init__.py +0 -0
- lfx/base/composio/composio_base.py +1291 -0
- lfx/base/compressors/__init__.py +0 -0
- lfx/base/compressors/model.py +60 -0
- lfx/base/constants.py +46 -0
- lfx/base/curl/__init__.py +0 -0
- lfx/base/curl/parse.py +188 -0
- lfx/base/data/__init__.py +5 -0
- lfx/base/data/base_file.py +685 -0
- lfx/base/data/docling_utils.py +245 -0
- lfx/base/data/utils.py +198 -0
- lfx/base/document_transformers/__init__.py +0 -0
- lfx/base/document_transformers/model.py +43 -0
- lfx/base/embeddings/__init__.py +0 -0
- lfx/base/embeddings/aiml_embeddings.py +62 -0
- lfx/base/embeddings/model.py +26 -0
- lfx/base/flow_processing/__init__.py +0 -0
- lfx/base/flow_processing/utils.py +86 -0
- lfx/base/huggingface/__init__.py +0 -0
- lfx/base/huggingface/model_bridge.py +133 -0
- lfx/base/io/__init__.py +0 -0
- lfx/base/io/chat.py +20 -0
- lfx/base/io/text.py +22 -0
- lfx/base/langchain_utilities/__init__.py +0 -0
- lfx/base/langchain_utilities/model.py +35 -0
- lfx/base/langchain_utilities/spider_constants.py +1 -0
- lfx/base/langwatch/__init__.py +0 -0
- lfx/base/langwatch/utils.py +18 -0
- lfx/base/mcp/__init__.py +0 -0
- lfx/base/mcp/constants.py +2 -0
- lfx/base/mcp/util.py +1398 -0
- lfx/base/memory/__init__.py +0 -0
- lfx/base/memory/memory.py +49 -0
- lfx/base/memory/model.py +38 -0
- lfx/base/models/__init__.py +3 -0
- lfx/base/models/aiml_constants.py +51 -0
- lfx/base/models/anthropic_constants.py +47 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/groq_constants.py +134 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +307 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +8 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +49 -0
- lfx/base/models/openai_constants.py +122 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/processing/__init__.py +0 -0
- lfx/base/prompts/__init__.py +0 -0
- lfx/base/prompts/api_utils.py +224 -0
- lfx/base/prompts/utils.py +61 -0
- lfx/base/textsplitters/__init__.py +0 -0
- lfx/base/textsplitters/model.py +28 -0
- lfx/base/tools/__init__.py +0 -0
- lfx/base/tools/base.py +26 -0
- lfx/base/tools/component_tool.py +325 -0
- lfx/base/tools/constants.py +49 -0
- lfx/base/tools/flow_tool.py +132 -0
- lfx/base/tools/run_flow.py +224 -0
- lfx/base/vectorstores/__init__.py +0 -0
- lfx/base/vectorstores/model.py +193 -0
- lfx/base/vectorstores/utils.py +22 -0
- lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
- lfx/cli/__init__.py +5 -0
- lfx/cli/commands.py +319 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +441 -0
- lfx/cli/script_loader.py +247 -0
- lfx/cli/serve_app.py +546 -0
- lfx/cli/validation.py +69 -0
- lfx/components/FAISS/__init__.py +34 -0
- lfx/components/FAISS/faiss.py +111 -0
- lfx/components/Notion/__init__.py +19 -0
- lfx/components/Notion/add_content_to_page.py +269 -0
- lfx/components/Notion/create_page.py +94 -0
- lfx/components/Notion/list_database_properties.py +68 -0
- lfx/components/Notion/list_pages.py +122 -0
- lfx/components/Notion/list_users.py +77 -0
- lfx/components/Notion/page_content_viewer.py +93 -0
- lfx/components/Notion/search.py +111 -0
- lfx/components/Notion/update_page_property.py +114 -0
- lfx/components/__init__.py +411 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/agents/__init__.py +34 -0
- lfx/components/agents/agent.py +558 -0
- lfx/components/agents/mcp_component.py +501 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +112 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +124 -0
- lfx/components/amazon/s3_bucket_uploader.py +211 -0
- lfx/components/anthropic/__init__.py +34 -0
- lfx/components/anthropic/anthropic.py +187 -0
- lfx/components/apify/__init__.py +5 -0
- lfx/components/apify/apify_actor.py +325 -0
- lfx/components/arxiv/__init__.py +3 -0
- lfx/components/arxiv/arxiv.py +163 -0
- lfx/components/assemblyai/__init__.py +46 -0
- lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- lfx/components/assemblyai/assemblyai_lemur.py +183 -0
- lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
- lfx/components/azure/__init__.py +37 -0
- lfx/components/azure/azure_openai.py +95 -0
- lfx/components/azure/azure_openai_embeddings.py +83 -0
- lfx/components/baidu/__init__.py +32 -0
- lfx/components/baidu/baidu_qianfan_chat.py +113 -0
- lfx/components/bing/__init__.py +3 -0
- lfx/components/bing/bing_search_api.py +61 -0
- lfx/components/cassandra/__init__.py +40 -0
- lfx/components/cassandra/cassandra.py +264 -0
- lfx/components/cassandra/cassandra_chat.py +92 -0
- lfx/components/cassandra/cassandra_graph.py +238 -0
- lfx/components/chains/__init__.py +3 -0
- lfx/components/chroma/__init__.py +34 -0
- lfx/components/chroma/chroma.py +167 -0
- lfx/components/cleanlab/__init__.py +40 -0
- lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
- lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- lfx/components/cleanlab/cleanlab_remediator.py +131 -0
- lfx/components/clickhouse/__init__.py +34 -0
- lfx/components/clickhouse/clickhouse.py +135 -0
- lfx/components/cloudflare/__init__.py +32 -0
- lfx/components/cloudflare/cloudflare.py +81 -0
- lfx/components/cohere/__init__.py +40 -0
- lfx/components/cohere/cohere_embeddings.py +81 -0
- lfx/components/cohere/cohere_models.py +46 -0
- lfx/components/cohere/cohere_rerank.py +51 -0
- lfx/components/composio/__init__.py +74 -0
- lfx/components/composio/composio_api.py +268 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/slack_composio.py +582 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/youtube_composio.py +11 -0
- lfx/components/confluence/__init__.py +3 -0
- lfx/components/confluence/confluence.py +84 -0
- lfx/components/couchbase/__init__.py +34 -0
- lfx/components/couchbase/couchbase.py +102 -0
- lfx/components/crewai/__init__.py +49 -0
- lfx/components/crewai/crewai.py +107 -0
- lfx/components/crewai/hierarchical_crew.py +46 -0
- lfx/components/crewai/hierarchical_task.py +44 -0
- lfx/components/crewai/sequential_crew.py +52 -0
- lfx/components/crewai/sequential_task.py +73 -0
- lfx/components/crewai/sequential_task_agent.py +143 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +64 -0
- lfx/components/data/api_request.py +544 -0
- lfx/components/data/csv_to_data.py +95 -0
- lfx/components/data/directory.py +113 -0
- lfx/components/data/file.py +577 -0
- lfx/components/data/json_to_data.py +98 -0
- lfx/components/data/news_search.py +164 -0
- lfx/components/data/rss.py +69 -0
- lfx/components/data/sql_executor.py +101 -0
- lfx/components/data/url.py +311 -0
- lfx/components/data/web_search.py +112 -0
- lfx/components/data/webhook.py +56 -0
- lfx/components/datastax/__init__.py +70 -0
- lfx/components/datastax/astra_assistant_manager.py +306 -0
- lfx/components/datastax/astra_db.py +75 -0
- lfx/components/datastax/astra_vectorize.py +124 -0
- lfx/components/datastax/astradb.py +1285 -0
- lfx/components/datastax/astradb_cql.py +314 -0
- lfx/components/datastax/astradb_graph.py +330 -0
- lfx/components/datastax/astradb_tool.py +414 -0
- lfx/components/datastax/astradb_vectorstore.py +1285 -0
- lfx/components/datastax/cassandra.py +92 -0
- lfx/components/datastax/create_assistant.py +58 -0
- lfx/components/datastax/create_thread.py +32 -0
- lfx/components/datastax/dotenv.py +35 -0
- lfx/components/datastax/get_assistant.py +37 -0
- lfx/components/datastax/getenvvar.py +30 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +314 -0
- lfx/components/datastax/list_assistants.py +25 -0
- lfx/components/datastax/run.py +89 -0
- lfx/components/deactivated/__init__.py +15 -0
- lfx/components/deactivated/amazon_kendra.py +66 -0
- lfx/components/deactivated/chat_litellm_model.py +158 -0
- lfx/components/deactivated/code_block_extractor.py +26 -0
- lfx/components/deactivated/documents_to_data.py +22 -0
- lfx/components/deactivated/embed.py +16 -0
- lfx/components/deactivated/extract_key_from_data.py +46 -0
- lfx/components/deactivated/json_document_builder.py +57 -0
- lfx/components/deactivated/list_flows.py +20 -0
- lfx/components/deactivated/mcp_sse.py +61 -0
- lfx/components/deactivated/mcp_stdio.py +62 -0
- lfx/components/deactivated/merge_data.py +93 -0
- lfx/components/deactivated/message.py +37 -0
- lfx/components/deactivated/metal.py +54 -0
- lfx/components/deactivated/multi_query.py +59 -0
- lfx/components/deactivated/retriever.py +43 -0
- lfx/components/deactivated/selective_passthrough.py +77 -0
- lfx/components/deactivated/should_run_next.py +40 -0
- lfx/components/deactivated/split_text.py +63 -0
- lfx/components/deactivated/store_message.py +24 -0
- lfx/components/deactivated/sub_flow.py +124 -0
- lfx/components/deactivated/vectara_self_query.py +76 -0
- lfx/components/deactivated/vector_store.py +24 -0
- lfx/components/deepseek/__init__.py +34 -0
- lfx/components/deepseek/deepseek.py +136 -0
- lfx/components/docling/__init__.py +43 -0
- lfx/components/docling/chunk_docling_document.py +186 -0
- lfx/components/docling/docling_inline.py +231 -0
- lfx/components/docling/docling_remote.py +193 -0
- lfx/components/docling/export_docling_document.py +117 -0
- lfx/components/documentloaders/__init__.py +3 -0
- lfx/components/duckduckgo/__init__.py +3 -0
- lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- lfx/components/elastic/__init__.py +37 -0
- lfx/components/elastic/elasticsearch.py +267 -0
- lfx/components/elastic/opensearch.py +243 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +76 -0
- lfx/components/embeddings/text_embedder.py +64 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/firecrawl/__init__.py +43 -0
- lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
- lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
- lfx/components/firecrawl/firecrawl_map_api.py +89 -0
- lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
- lfx/components/git/__init__.py +4 -0
- lfx/components/git/git.py +262 -0
- lfx/components/git/gitextractor.py +196 -0
- lfx/components/glean/__init__.py +3 -0
- lfx/components/glean/glean_search_api.py +173 -0
- lfx/components/google/__init__.py +17 -0
- lfx/components/google/gmail.py +192 -0
- lfx/components/google/google_bq_sql_executor.py +157 -0
- lfx/components/google/google_drive.py +92 -0
- lfx/components/google/google_drive_search.py +152 -0
- lfx/components/google/google_generative_ai.py +147 -0
- lfx/components/google/google_generative_ai_embeddings.py +141 -0
- lfx/components/google/google_oauth_token.py +89 -0
- lfx/components/google/google_search_api_core.py +68 -0
- lfx/components/google/google_serper_api_core.py +74 -0
- lfx/components/groq/__init__.py +34 -0
- lfx/components/groq/groq.py +136 -0
- lfx/components/helpers/__init__.py +52 -0
- lfx/components/helpers/calculator_core.py +89 -0
- lfx/components/helpers/create_list.py +40 -0
- lfx/components/helpers/current_date.py +42 -0
- lfx/components/helpers/id_generator.py +42 -0
- lfx/components/helpers/memory.py +251 -0
- lfx/components/helpers/output_parser.py +45 -0
- lfx/components/helpers/store_message.py +90 -0
- lfx/components/homeassistant/__init__.py +7 -0
- lfx/components/homeassistant/home_assistant_control.py +152 -0
- lfx/components/homeassistant/list_home_assistant_states.py +137 -0
- lfx/components/huggingface/__init__.py +37 -0
- lfx/components/huggingface/huggingface.py +197 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +203 -0
- lfx/components/ibm/watsonx_embeddings.py +135 -0
- lfx/components/icosacomputing/__init__.py +5 -0
- lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
- lfx/components/input_output/__init__.py +38 -0
- lfx/components/input_output/chat.py +120 -0
- lfx/components/input_output/chat_output.py +200 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/jigsawstack/__init__.py +23 -0
- lfx/components/jigsawstack/ai_scrape.py +126 -0
- lfx/components/jigsawstack/ai_web_search.py +136 -0
- lfx/components/jigsawstack/file_read.py +115 -0
- lfx/components/jigsawstack/file_upload.py +94 -0
- lfx/components/jigsawstack/image_generation.py +205 -0
- lfx/components/jigsawstack/nsfw.py +60 -0
- lfx/components/jigsawstack/object_detection.py +124 -0
- lfx/components/jigsawstack/sentiment.py +112 -0
- lfx/components/jigsawstack/text_to_sql.py +90 -0
- lfx/components/jigsawstack/text_translate.py +77 -0
- lfx/components/jigsawstack/vocr.py +107 -0
- lfx/components/langchain_utilities/__init__.py +109 -0
- lfx/components/langchain_utilities/character.py +53 -0
- lfx/components/langchain_utilities/conversation.py +59 -0
- lfx/components/langchain_utilities/csv_agent.py +107 -0
- lfx/components/langchain_utilities/fake_embeddings.py +26 -0
- lfx/components/langchain_utilities/html_link_extractor.py +35 -0
- lfx/components/langchain_utilities/json_agent.py +45 -0
- lfx/components/langchain_utilities/langchain_hub.py +126 -0
- lfx/components/langchain_utilities/language_recursive.py +49 -0
- lfx/components/langchain_utilities/language_semantic.py +138 -0
- lfx/components/langchain_utilities/llm_checker.py +39 -0
- lfx/components/langchain_utilities/llm_math.py +42 -0
- lfx/components/langchain_utilities/natural_language.py +61 -0
- lfx/components/langchain_utilities/openai_tools.py +53 -0
- lfx/components/langchain_utilities/openapi.py +48 -0
- lfx/components/langchain_utilities/recursive_character.py +60 -0
- lfx/components/langchain_utilities/retrieval_qa.py +83 -0
- lfx/components/langchain_utilities/runnable_executor.py +137 -0
- lfx/components/langchain_utilities/self_query.py +80 -0
- lfx/components/langchain_utilities/spider.py +142 -0
- lfx/components/langchain_utilities/sql.py +40 -0
- lfx/components/langchain_utilities/sql_database.py +35 -0
- lfx/components/langchain_utilities/sql_generator.py +78 -0
- lfx/components/langchain_utilities/tool_calling.py +59 -0
- lfx/components/langchain_utilities/vector_store_info.py +49 -0
- lfx/components/langchain_utilities/vector_store_router.py +33 -0
- lfx/components/langchain_utilities/xml_agent.py +71 -0
- lfx/components/langwatch/__init__.py +3 -0
- lfx/components/langwatch/langwatch.py +278 -0
- lfx/components/link_extractors/__init__.py +3 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +129 -0
- lfx/components/logic/__init__.py +52 -0
- lfx/components/logic/conditional_router.py +171 -0
- lfx/components/logic/data_conditional_router.py +125 -0
- lfx/components/logic/flow_tool.py +110 -0
- lfx/components/logic/listen.py +29 -0
- lfx/components/logic/loop.py +125 -0
- lfx/components/logic/notify.py +88 -0
- lfx/components/logic/pass_message.py +35 -0
- lfx/components/logic/run_flow.py +71 -0
- lfx/components/logic/sub_flow.py +114 -0
- lfx/components/maritalk/__init__.py +32 -0
- lfx/components/maritalk/maritalk.py +52 -0
- lfx/components/mem0/__init__.py +3 -0
- lfx/components/mem0/mem0_chat_memory.py +136 -0
- lfx/components/milvus/__init__.py +34 -0
- lfx/components/milvus/milvus.py +115 -0
- lfx/components/mistral/__init__.py +37 -0
- lfx/components/mistral/mistral.py +114 -0
- lfx/components/mistral/mistral_embeddings.py +58 -0
- lfx/components/models/__init__.py +34 -0
- lfx/components/models/embedding_model.py +114 -0
- lfx/components/models/language_model.py +144 -0
- lfx/components/mongodb/__init__.py +34 -0
- lfx/components/mongodb/mongodb_atlas.py +213 -0
- lfx/components/needle/__init__.py +3 -0
- lfx/components/needle/needle.py +104 -0
- lfx/components/notdiamond/__init__.py +34 -0
- lfx/components/notdiamond/notdiamond.py +228 -0
- lfx/components/novita/__init__.py +32 -0
- lfx/components/novita/novita.py +130 -0
- lfx/components/nvidia/__init__.py +57 -0
- lfx/components/nvidia/nvidia.py +157 -0
- lfx/components/nvidia/nvidia_embedding.py +77 -0
- lfx/components/nvidia/nvidia_ingest.py +317 -0
- lfx/components/nvidia/nvidia_rerank.py +63 -0
- lfx/components/nvidia/system_assist.py +65 -0
- lfx/components/olivya/__init__.py +3 -0
- lfx/components/olivya/olivya.py +116 -0
- lfx/components/ollama/__init__.py +37 -0
- lfx/components/ollama/ollama.py +330 -0
- lfx/components/ollama/ollama_embeddings.py +106 -0
- lfx/components/openai/__init__.py +37 -0
- lfx/components/openai/openai.py +100 -0
- lfx/components/openai/openai_chat_model.py +176 -0
- lfx/components/openrouter/__init__.py +32 -0
- lfx/components/openrouter/openrouter.py +202 -0
- lfx/components/output_parsers/__init__.py +3 -0
- lfx/components/perplexity/__init__.py +34 -0
- lfx/components/perplexity/perplexity.py +75 -0
- lfx/components/pgvector/__init__.py +34 -0
- lfx/components/pgvector/pgvector.py +72 -0
- lfx/components/pinecone/__init__.py +34 -0
- lfx/components/pinecone/pinecone.py +134 -0
- lfx/components/processing/__init__.py +117 -0
- lfx/components/processing/alter_metadata.py +108 -0
- lfx/components/processing/batch_run.py +205 -0
- lfx/components/processing/combine_text.py +39 -0
- lfx/components/processing/converter.py +159 -0
- lfx/components/processing/create_data.py +110 -0
- lfx/components/processing/data_operations.py +438 -0
- lfx/components/processing/data_to_dataframe.py +70 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/extract_key.py +53 -0
- lfx/components/processing/filter_data.py +42 -0
- lfx/components/processing/filter_data_values.py +88 -0
- lfx/components/processing/json_cleaner.py +103 -0
- lfx/components/processing/lambda_filter.py +154 -0
- lfx/components/processing/llm_router.py +499 -0
- lfx/components/processing/merge_data.py +90 -0
- lfx/components/processing/message_to_data.py +36 -0
- lfx/components/processing/parse_data.py +70 -0
- lfx/components/processing/parse_dataframe.py +68 -0
- lfx/components/processing/parse_json_data.py +90 -0
- lfx/components/processing/parser.py +143 -0
- lfx/components/processing/prompt.py +67 -0
- lfx/components/processing/python_repl_core.py +98 -0
- lfx/components/processing/regex.py +82 -0
- lfx/components/processing/save_file.py +225 -0
- lfx/components/processing/select_data.py +48 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/structured_output.py +202 -0
- lfx/components/processing/update_data.py +160 -0
- lfx/components/prototypes/__init__.py +34 -0
- lfx/components/prototypes/python_function.py +73 -0
- lfx/components/qdrant/__init__.py +34 -0
- lfx/components/qdrant/qdrant.py +109 -0
- lfx/components/redis/__init__.py +37 -0
- lfx/components/redis/redis.py +89 -0
- lfx/components/redis/redis_chat.py +43 -0
- lfx/components/sambanova/__init__.py +32 -0
- lfx/components/sambanova/sambanova.py +84 -0
- lfx/components/scrapegraph/__init__.py +40 -0
- lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- lfx/components/searchapi/__init__.py +34 -0
- lfx/components/searchapi/search.py +79 -0
- lfx/components/serpapi/__init__.py +3 -0
- lfx/components/serpapi/serp.py +115 -0
- lfx/components/supabase/__init__.py +34 -0
- lfx/components/supabase/supabase.py +76 -0
- lfx/components/tavily/__init__.py +4 -0
- lfx/components/tavily/tavily_extract.py +117 -0
- lfx/components/tavily/tavily_search.py +212 -0
- lfx/components/textsplitters/__init__.py +3 -0
- lfx/components/toolkits/__init__.py +3 -0
- lfx/components/tools/__init__.py +72 -0
- lfx/components/tools/calculator.py +108 -0
- lfx/components/tools/google_search_api.py +45 -0
- lfx/components/tools/google_serper_api.py +115 -0
- lfx/components/tools/python_code_structured_tool.py +327 -0
- lfx/components/tools/python_repl.py +97 -0
- lfx/components/tools/search_api.py +87 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +119 -0
- lfx/components/tools/tavily_search_tool.py +344 -0
- lfx/components/tools/wikidata_api.py +102 -0
- lfx/components/tools/wikipedia_api.py +49 -0
- lfx/components/tools/yahoo_finance.py +129 -0
- lfx/components/twelvelabs/__init__.py +52 -0
- lfx/components/twelvelabs/convert_astra_results.py +84 -0
- lfx/components/twelvelabs/pegasus_index.py +311 -0
- lfx/components/twelvelabs/split_video.py +291 -0
- lfx/components/twelvelabs/text_embeddings.py +57 -0
- lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- lfx/components/twelvelabs/video_embeddings.py +100 -0
- lfx/components/twelvelabs/video_file.py +179 -0
- lfx/components/unstructured/__init__.py +3 -0
- lfx/components/unstructured/unstructured.py +121 -0
- lfx/components/upstash/__init__.py +34 -0
- lfx/components/upstash/upstash.py +124 -0
- lfx/components/vectara/__init__.py +37 -0
- lfx/components/vectara/vectara.py +97 -0
- lfx/components/vectara/vectara_rag.py +164 -0
- lfx/components/vectorstores/__init__.py +40 -0
- lfx/components/vectorstores/astradb.py +1285 -0
- lfx/components/vectorstores/astradb_graph.py +319 -0
- lfx/components/vectorstores/cassandra.py +264 -0
- lfx/components/vectorstores/cassandra_graph.py +238 -0
- lfx/components/vectorstores/chroma.py +167 -0
- lfx/components/vectorstores/clickhouse.py +135 -0
- lfx/components/vectorstores/couchbase.py +102 -0
- lfx/components/vectorstores/elasticsearch.py +267 -0
- lfx/components/vectorstores/faiss.py +111 -0
- lfx/components/vectorstores/graph_rag.py +141 -0
- lfx/components/vectorstores/hcd.py +314 -0
- lfx/components/vectorstores/local_db.py +261 -0
- lfx/components/vectorstores/milvus.py +115 -0
- lfx/components/vectorstores/mongodb_atlas.py +213 -0
- lfx/components/vectorstores/opensearch.py +243 -0
- lfx/components/vectorstores/pgvector.py +72 -0
- lfx/components/vectorstores/pinecone.py +134 -0
- lfx/components/vectorstores/qdrant.py +109 -0
- lfx/components/vectorstores/supabase.py +76 -0
- lfx/components/vectorstores/upstash.py +124 -0
- lfx/components/vectorstores/vectara.py +97 -0
- lfx/components/vectorstores/vectara_rag.py +164 -0
- lfx/components/vectorstores/weaviate.py +89 -0
- lfx/components/vertexai/__init__.py +37 -0
- lfx/components/vertexai/vertexai.py +71 -0
- lfx/components/vertexai/vertexai_embeddings.py +67 -0
- lfx/components/weaviate/__init__.py +34 -0
- lfx/components/weaviate/weaviate.py +89 -0
- lfx/components/wikipedia/__init__.py +4 -0
- lfx/components/wikipedia/wikidata.py +86 -0
- lfx/components/wikipedia/wikipedia.py +53 -0
- lfx/components/wolframalpha/__init__.py +3 -0
- lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
- lfx/components/xai/__init__.py +32 -0
- lfx/components/xai/xai.py +167 -0
- lfx/components/yahoosearch/__init__.py +3 -0
- lfx/components/yahoosearch/yahoo.py +137 -0
- lfx/components/youtube/__init__.py +52 -0
- lfx/components/youtube/channel.py +227 -0
- lfx/components/youtube/comments.py +231 -0
- lfx/components/youtube/playlist.py +33 -0
- lfx/components/youtube/search.py +120 -0
- lfx/components/youtube/trending.py +285 -0
- lfx/components/youtube/video_details.py +263 -0
- lfx/components/youtube/youtube_transcripts.py +118 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +44 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +86 -0
- lfx/custom/code_parser/__init__.py +3 -0
- lfx/custom/code_parser/code_parser.py +361 -0
- lfx/custom/custom_component/__init__.py +0 -0
- lfx/custom/custom_component/base_component.py +128 -0
- lfx/custom/custom_component/component.py +1808 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +588 -0
- lfx/custom/dependency_analyzer.py +165 -0
- lfx/custom/directory_reader/__init__.py +3 -0
- lfx/custom/directory_reader/directory_reader.py +359 -0
- lfx/custom/directory_reader/utils.py +171 -0
- lfx/custom/eval.py +12 -0
- lfx/custom/schema.py +32 -0
- lfx/custom/tree_visitor.py +21 -0
- lfx/custom/utils.py +877 -0
- lfx/custom/validate.py +488 -0
- lfx/events/__init__.py +1 -0
- lfx/events/event_manager.py +110 -0
- lfx/exceptions/__init__.py +0 -0
- lfx/exceptions/component.py +15 -0
- lfx/field_typing/__init__.py +91 -0
- lfx/field_typing/constants.py +215 -0
- lfx/field_typing/range_spec.py +35 -0
- lfx/graph/__init__.py +6 -0
- lfx/graph/edge/__init__.py +0 -0
- lfx/graph/edge/base.py +277 -0
- lfx/graph/edge/schema.py +119 -0
- lfx/graph/edge/utils.py +0 -0
- lfx/graph/graph/__init__.py +0 -0
- lfx/graph/graph/ascii.py +202 -0
- lfx/graph/graph/base.py +2238 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +52 -0
- lfx/graph/graph/state_model.py +66 -0
- lfx/graph/graph/utils.py +1024 -0
- lfx/graph/schema.py +75 -0
- lfx/graph/state/__init__.py +0 -0
- lfx/graph/state/model.py +237 -0
- lfx/graph/utils.py +200 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +823 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +264 -0
- lfx/graph/vertex/schema.py +26 -0
- lfx/graph/vertex/utils.py +19 -0
- lfx/graph/vertex/vertex_types.py +489 -0
- lfx/helpers/__init__.py +1 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +194 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +328 -0
- lfx/inputs/inputs.py +714 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +489 -0
- lfx/interface/importing/__init__.py +5 -0
- lfx/interface/importing/utils.py +39 -0
- lfx/interface/initialize/__init__.py +3 -0
- lfx/interface/initialize/loading.py +224 -0
- lfx/interface/listing.py +26 -0
- lfx/interface/run.py +16 -0
- lfx/interface/utils.py +111 -0
- lfx/io/__init__.py +63 -0
- lfx/io/schema.py +289 -0
- lfx/load/__init__.py +8 -0
- lfx/load/load.py +256 -0
- lfx/load/utils.py +99 -0
- lfx/log/__init__.py +5 -0
- lfx/log/logger.py +385 -0
- lfx/memory/__init__.py +90 -0
- lfx/memory/stubs.py +283 -0
- lfx/processing/__init__.py +1 -0
- lfx/processing/process.py +238 -0
- lfx/processing/utils.py +25 -0
- lfx/py.typed +0 -0
- lfx/schema/__init__.py +66 -0
- lfx/schema/artifact.py +83 -0
- lfx/schema/content_block.py +62 -0
- lfx/schema/content_types.py +91 -0
- lfx/schema/data.py +308 -0
- lfx/schema/dataframe.py +210 -0
- lfx/schema/dotdict.py +74 -0
- lfx/schema/encoders.py +13 -0
- lfx/schema/graph.py +47 -0
- lfx/schema/image.py +131 -0
- lfx/schema/json_schema.py +141 -0
- lfx/schema/log.py +61 -0
- lfx/schema/message.py +473 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +171 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +140 -0
- lfx/schema/validators.py +114 -0
- lfx/serialization/__init__.py +5 -0
- lfx/serialization/constants.py +2 -0
- lfx/serialization/serialization.py +314 -0
- lfx/services/__init__.py +23 -0
- lfx/services/base.py +28 -0
- lfx/services/cache/__init__.py +6 -0
- lfx/services/cache/base.py +183 -0
- lfx/services/cache/service.py +166 -0
- lfx/services/cache/utils.py +169 -0
- lfx/services/chat/__init__.py +1 -0
- lfx/services/chat/config.py +2 -0
- lfx/services/chat/schema.py +10 -0
- lfx/services/deps.py +129 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +172 -0
- lfx/services/schema.py +20 -0
- lfx/services/session.py +82 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +130 -0
- lfx/services/settings/base.py +539 -0
- lfx/services/settings/constants.py +31 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +12 -0
- lfx/services/settings/service.py +35 -0
- lfx/services/settings/utils.py +40 -0
- lfx/services/shared_component_cache/__init__.py +1 -0
- lfx/services/shared_component_cache/factory.py +30 -0
- lfx/services/shared_component_cache/service.py +9 -0
- lfx/services/storage/__init__.py +5 -0
- lfx/services/storage/local.py +155 -0
- lfx/services/storage/service.py +54 -0
- lfx/services/tracing/__init__.py +1 -0
- lfx/services/tracing/service.py +21 -0
- lfx/settings.py +6 -0
- lfx/template/__init__.py +6 -0
- lfx/template/field/__init__.py +0 -0
- lfx/template/field/base.py +257 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +212 -0
- lfx/template/frontend_node/constants.py +65 -0
- lfx/template/frontend_node/custom_components.py +79 -0
- lfx/template/template/__init__.py +0 -0
- lfx/template/template/base.py +100 -0
- lfx/template/utils.py +217 -0
- lfx/type_extraction/__init__.py +19 -0
- lfx/type_extraction/type_extraction.py +75 -0
- lfx/type_extraction.py +80 -0
- lfx/utils/__init__.py +1 -0
- lfx/utils/async_helpers.py +42 -0
- lfx/utils/component_utils.py +154 -0
- lfx/utils/concurrency.py +60 -0
- lfx/utils/connection_string_parser.py +11 -0
- lfx/utils/constants.py +205 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +28 -0
- lfx/utils/image.py +73 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/util.py +481 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
- lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
- lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
- lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,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/components-data#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})
|
@@ -0,0 +1,112 @@
|
|
1
|
+
import re
|
2
|
+
from urllib.parse import parse_qs, unquote, urlparse
|
3
|
+
|
4
|
+
import pandas as pd
|
5
|
+
import requests
|
6
|
+
from bs4 import BeautifulSoup
|
7
|
+
|
8
|
+
from lfx.custom import Component
|
9
|
+
from lfx.io import IntInput, MessageTextInput, Output
|
10
|
+
from lfx.schema import DataFrame
|
11
|
+
from lfx.utils.request_utils import get_user_agent
|
12
|
+
|
13
|
+
|
14
|
+
class WebSearchComponent(Component):
|
15
|
+
display_name = "Web Search"
|
16
|
+
description = "Performs a basic DuckDuckGo search (HTML scraping). May be subject to rate limits."
|
17
|
+
documentation: str = "https://docs.langflow.org/components-data#web-search"
|
18
|
+
icon = "search"
|
19
|
+
name = "WebSearchNoAPI"
|
20
|
+
|
21
|
+
inputs = [
|
22
|
+
MessageTextInput(
|
23
|
+
name="query",
|
24
|
+
display_name="Search Query",
|
25
|
+
info="Keywords to search for.",
|
26
|
+
tool_mode=True,
|
27
|
+
required=True,
|
28
|
+
),
|
29
|
+
IntInput(
|
30
|
+
name="timeout",
|
31
|
+
display_name="Timeout",
|
32
|
+
info="Timeout for the web search request.",
|
33
|
+
value=5,
|
34
|
+
advanced=True,
|
35
|
+
),
|
36
|
+
]
|
37
|
+
|
38
|
+
outputs = [Output(name="results", display_name="Search Results", method="perform_search")]
|
39
|
+
|
40
|
+
def validate_url(self, string: str) -> bool:
|
41
|
+
url_regex = re.compile(
|
42
|
+
r"^(https?:\/\/)?" r"(www\.)?" r"([a-zA-Z0-9.-]+)" r"(\.[a-zA-Z]{2,})?" r"(:\d+)?" r"(\/[^\s]*)?$",
|
43
|
+
re.IGNORECASE,
|
44
|
+
)
|
45
|
+
return bool(url_regex.match(string))
|
46
|
+
|
47
|
+
def ensure_url(self, url: str) -> str:
|
48
|
+
if not url.startswith(("http://", "https://")):
|
49
|
+
url = "https://" + url
|
50
|
+
if not self.validate_url(url):
|
51
|
+
msg = f"Invalid URL: {url}"
|
52
|
+
raise ValueError(msg)
|
53
|
+
return url
|
54
|
+
|
55
|
+
def _sanitize_query(self, query: str) -> str:
|
56
|
+
"""Sanitize search query."""
|
57
|
+
# Remove potentially dangerous characters
|
58
|
+
return re.sub(r'[<>"\']', "", query.strip())
|
59
|
+
|
60
|
+
def perform_search(self) -> DataFrame:
|
61
|
+
query = self._sanitize_query(self.query)
|
62
|
+
if not query:
|
63
|
+
msg = "Empty search query"
|
64
|
+
raise ValueError(msg)
|
65
|
+
headers = {"User-Agent": get_user_agent()}
|
66
|
+
params = {"q": query, "kl": "us-en"}
|
67
|
+
url = "https://html.duckduckgo.com/html/"
|
68
|
+
|
69
|
+
try:
|
70
|
+
response = requests.get(url, params=params, headers=headers, timeout=self.timeout)
|
71
|
+
response.raise_for_status()
|
72
|
+
except requests.RequestException as e:
|
73
|
+
self.status = f"Failed request: {e!s}"
|
74
|
+
return DataFrame(pd.DataFrame([{"title": "Error", "link": "", "snippet": str(e), "content": ""}]))
|
75
|
+
|
76
|
+
if not response.text or "text/html" not in response.headers.get("content-type", "").lower():
|
77
|
+
self.status = "No results found"
|
78
|
+
return DataFrame(
|
79
|
+
pd.DataFrame([{"title": "Error", "link": "", "snippet": "No results found", "content": ""}])
|
80
|
+
)
|
81
|
+
soup = BeautifulSoup(response.text, "html.parser")
|
82
|
+
results = []
|
83
|
+
|
84
|
+
for result in soup.select("div.result"):
|
85
|
+
title_tag = result.select_one("a.result__a")
|
86
|
+
snippet_tag = result.select_one("a.result__snippet")
|
87
|
+
if title_tag:
|
88
|
+
raw_link = title_tag.get("href", "")
|
89
|
+
parsed = urlparse(raw_link)
|
90
|
+
uddg = parse_qs(parsed.query).get("uddg", [""])[0]
|
91
|
+
decoded_link = unquote(uddg) if uddg else raw_link
|
92
|
+
|
93
|
+
try:
|
94
|
+
final_url = self.ensure_url(decoded_link)
|
95
|
+
page = requests.get(final_url, headers=headers, timeout=self.timeout)
|
96
|
+
page.raise_for_status()
|
97
|
+
content = BeautifulSoup(page.text, "lxml").get_text(separator=" ", strip=True)
|
98
|
+
except requests.RequestException as e:
|
99
|
+
final_url = decoded_link
|
100
|
+
content = f"(Failed to fetch: {e!s}"
|
101
|
+
|
102
|
+
results.append(
|
103
|
+
{
|
104
|
+
"title": title_tag.get_text(strip=True),
|
105
|
+
"link": final_url,
|
106
|
+
"snippet": snippet_tag.get_text(strip=True) if snippet_tag else "",
|
107
|
+
"content": content,
|
108
|
+
}
|
109
|
+
)
|
110
|
+
|
111
|
+
df_results = pd.DataFrame(results)
|
112
|
+
return DataFrame(df_results)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
import json
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.io import MultilineInput, Output
|
5
|
+
from lfx.schema.data import Data
|
6
|
+
|
7
|
+
|
8
|
+
class WebhookComponent(Component):
|
9
|
+
display_name = "Webhook"
|
10
|
+
documentation: str = "https://docs.langflow.org/components-data#webhook"
|
11
|
+
name = "Webhook"
|
12
|
+
icon = "webhook"
|
13
|
+
|
14
|
+
inputs = [
|
15
|
+
MultilineInput(
|
16
|
+
name="data",
|
17
|
+
display_name="Payload",
|
18
|
+
info="Receives a payload from external systems via HTTP POST.",
|
19
|
+
advanced=True,
|
20
|
+
),
|
21
|
+
MultilineInput(
|
22
|
+
name="curl",
|
23
|
+
display_name="cURL",
|
24
|
+
value="CURL_WEBHOOK",
|
25
|
+
advanced=True,
|
26
|
+
input_types=[],
|
27
|
+
),
|
28
|
+
MultilineInput(
|
29
|
+
name="endpoint",
|
30
|
+
display_name="Endpoint",
|
31
|
+
value="BACKEND_URL",
|
32
|
+
advanced=False,
|
33
|
+
copy_field=True,
|
34
|
+
input_types=[],
|
35
|
+
),
|
36
|
+
]
|
37
|
+
outputs = [
|
38
|
+
Output(display_name="Data", name="output_data", method="build_data"),
|
39
|
+
]
|
40
|
+
|
41
|
+
def build_data(self) -> Data:
|
42
|
+
message: str | Data = ""
|
43
|
+
if not self.data:
|
44
|
+
self.status = "No data provided."
|
45
|
+
return Data(data={})
|
46
|
+
try:
|
47
|
+
my_data = self.data.replace('"\n"', '"\\n"')
|
48
|
+
body = json.loads(my_data or "{}")
|
49
|
+
except json.JSONDecodeError:
|
50
|
+
body = {"payload": self.data}
|
51
|
+
message = f"Invalid JSON payload. Please check the format.\n\n{self.data}"
|
52
|
+
data = Data(data=body)
|
53
|
+
if not message:
|
54
|
+
message = data
|
55
|
+
self.status = message
|
56
|
+
return data
|
@@ -0,0 +1,70 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any
|
4
|
+
|
5
|
+
from lfx.components._importing import import_mod
|
6
|
+
|
7
|
+
if TYPE_CHECKING:
|
8
|
+
from .astra_assistant_manager import AstraAssistantManager
|
9
|
+
from .astra_db import AstraDBChatMemory
|
10
|
+
from .astra_vectorize import AstraVectorizeComponent
|
11
|
+
from .astradb_cql import AstraDBCQLToolComponent
|
12
|
+
from .astradb_tool import AstraDBToolComponent
|
13
|
+
from .astradb_vectorstore import AstraDBVectorStoreComponent
|
14
|
+
from .create_assistant import AssistantsCreateAssistant
|
15
|
+
from .create_thread import AssistantsCreateThread
|
16
|
+
from .dotenv import Dotenv
|
17
|
+
from .get_assistant import AssistantsGetAssistantName
|
18
|
+
from .getenvvar import GetEnvVar
|
19
|
+
from .list_assistants import AssistantsListAssistants
|
20
|
+
from .run import AssistantsRun
|
21
|
+
|
22
|
+
_dynamic_imports = {
|
23
|
+
"AssistantsCreateAssistant": "create_assistant",
|
24
|
+
"AssistantsCreateThread": "create_thread",
|
25
|
+
"AssistantsGetAssistantName": "get_assistant",
|
26
|
+
"AssistantsListAssistants": "list_assistants",
|
27
|
+
"AssistantsRun": "run",
|
28
|
+
"AstraAssistantManager": "astra_assistant_manager",
|
29
|
+
"AstraDBCQLToolComponent": "astradb_cql",
|
30
|
+
"AstraDBChatMemory": "astra_db",
|
31
|
+
"AstraDBToolComponent": "astradb_tool",
|
32
|
+
"AstraDBVectorStoreComponent": "astradb_vectorstore",
|
33
|
+
"AstraVectorizeComponent": "astra_vectorize",
|
34
|
+
"Dotenv": "dotenv",
|
35
|
+
"GetEnvVar": "getenvvar",
|
36
|
+
}
|
37
|
+
|
38
|
+
__all__ = [
|
39
|
+
"AssistantsCreateAssistant",
|
40
|
+
"AssistantsCreateThread",
|
41
|
+
"AssistantsGetAssistantName",
|
42
|
+
"AssistantsListAssistants",
|
43
|
+
"AssistantsRun",
|
44
|
+
"AstraAssistantManager",
|
45
|
+
"AstraDBCQLToolComponent",
|
46
|
+
"AstraDBChatMemory",
|
47
|
+
"AstraDBToolComponent",
|
48
|
+
"AstraDBVectorStoreComponent",
|
49
|
+
"AstraVectorizeComponent",
|
50
|
+
"Dotenv",
|
51
|
+
"GetEnvVar",
|
52
|
+
]
|
53
|
+
|
54
|
+
|
55
|
+
def __getattr__(attr_name: str) -> Any:
|
56
|
+
"""Lazily import datastax components on attribute access."""
|
57
|
+
if attr_name not in _dynamic_imports:
|
58
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
59
|
+
raise AttributeError(msg)
|
60
|
+
try:
|
61
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
62
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
63
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
64
|
+
raise AttributeError(msg) from e
|
65
|
+
globals()[attr_name] = result
|
66
|
+
return result
|
67
|
+
|
68
|
+
|
69
|
+
def __dir__() -> list[str]:
|
70
|
+
return list(__all__)
|