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,136 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.io import BoolInput, DataInput, MultilineInput, Output, SecretStrInput
|
3
|
+
from lfx.log.logger import logger
|
4
|
+
from lfx.schema.data import Data
|
5
|
+
|
6
|
+
|
7
|
+
class FirecrawlExtractApi(Component):
|
8
|
+
display_name: str = "Firecrawl Extract API"
|
9
|
+
description: str = "Extracts data from a URL."
|
10
|
+
name = "FirecrawlExtractApi"
|
11
|
+
|
12
|
+
documentation: str = "https://docs.firecrawl.dev/api-reference/endpoint/extract"
|
13
|
+
|
14
|
+
inputs = [
|
15
|
+
SecretStrInput(
|
16
|
+
name="api_key",
|
17
|
+
display_name="API Key",
|
18
|
+
required=True,
|
19
|
+
password=True,
|
20
|
+
info="The API key to use Firecrawl API.",
|
21
|
+
),
|
22
|
+
MultilineInput(
|
23
|
+
name="urls",
|
24
|
+
display_name="URLs",
|
25
|
+
required=True,
|
26
|
+
info="List of URLs to extract data from (separated by commas or new lines).",
|
27
|
+
tool_mode=True,
|
28
|
+
),
|
29
|
+
MultilineInput(
|
30
|
+
name="prompt",
|
31
|
+
display_name="Prompt",
|
32
|
+
required=True,
|
33
|
+
info="Prompt to guide the extraction process.",
|
34
|
+
tool_mode=True,
|
35
|
+
),
|
36
|
+
DataInput(
|
37
|
+
name="schema",
|
38
|
+
display_name="Schema",
|
39
|
+
required=False,
|
40
|
+
info="Schema to define the structure of the extracted data.",
|
41
|
+
),
|
42
|
+
BoolInput(
|
43
|
+
name="enable_web_search",
|
44
|
+
display_name="Enable Web Search",
|
45
|
+
info="When true, the extraction will use web search to find additional data.",
|
46
|
+
),
|
47
|
+
# # Optional: Not essential for basic extraction
|
48
|
+
# BoolInput(
|
49
|
+
# name="ignore_sitemap",
|
50
|
+
# display_name="Ignore Sitemap",
|
51
|
+
# info="When true, sitemap.xml files will be ignored during website scanning.",
|
52
|
+
# ),
|
53
|
+
# # Optional: Not essential for basic extraction
|
54
|
+
# BoolInput(
|
55
|
+
# name="include_subdomains",
|
56
|
+
# display_name="Include Subdomains",
|
57
|
+
# info="When true, subdomains of the provided URLs will also be scanned.",
|
58
|
+
# ),
|
59
|
+
# # Optional: Not essential for basic extraction
|
60
|
+
# BoolInput(
|
61
|
+
# name="show_sources",
|
62
|
+
# display_name="Show Sources",
|
63
|
+
# info="When true, the sources used to extract the data will be included in the response.",
|
64
|
+
# ),
|
65
|
+
]
|
66
|
+
|
67
|
+
outputs = [
|
68
|
+
Output(display_name="Data", name="data", method="extract"),
|
69
|
+
]
|
70
|
+
|
71
|
+
def extract(self) -> Data:
|
72
|
+
try:
|
73
|
+
from firecrawl import FirecrawlApp
|
74
|
+
except ImportError as e:
|
75
|
+
msg = "Could not import firecrawl integration package. Please install it with `pip install firecrawl-py`."
|
76
|
+
raise ImportError(msg) from e
|
77
|
+
|
78
|
+
# Validate API key
|
79
|
+
if not self.api_key:
|
80
|
+
msg = "API key is required"
|
81
|
+
raise ValueError(msg)
|
82
|
+
|
83
|
+
# Validate URLs
|
84
|
+
if not self.urls:
|
85
|
+
msg = "URLs are required"
|
86
|
+
raise ValueError(msg)
|
87
|
+
|
88
|
+
# Split and validate URLs (handle both commas and newlines)
|
89
|
+
urls = [url.strip() for url in self.urls.replace("\n", ",").split(",") if url.strip()]
|
90
|
+
if not urls:
|
91
|
+
msg = "No valid URLs provided"
|
92
|
+
raise ValueError(msg)
|
93
|
+
|
94
|
+
# Validate and process prompt
|
95
|
+
if not self.prompt:
|
96
|
+
msg = "Prompt is required"
|
97
|
+
raise ValueError(msg)
|
98
|
+
|
99
|
+
# Get the prompt text (handling both string and multiline input)
|
100
|
+
prompt_text = self.prompt.strip()
|
101
|
+
|
102
|
+
# Enhance the prompt to encourage comprehensive extraction
|
103
|
+
enhanced_prompt = prompt_text
|
104
|
+
if "schema" not in prompt_text.lower():
|
105
|
+
enhanced_prompt = f"{prompt_text}. Please extract all instances in a comprehensive, structured format."
|
106
|
+
|
107
|
+
params = {
|
108
|
+
"prompt": enhanced_prompt,
|
109
|
+
"enableWebSearch": self.enable_web_search,
|
110
|
+
# Optional parameters - not essential for basic extraction
|
111
|
+
"ignoreSitemap": self.ignore_sitemap,
|
112
|
+
"includeSubdomains": self.include_subdomains,
|
113
|
+
"showSources": self.show_sources,
|
114
|
+
"timeout": 300,
|
115
|
+
}
|
116
|
+
|
117
|
+
# Only add schema to params if it's provided and is a valid schema structure
|
118
|
+
if self.schema:
|
119
|
+
try:
|
120
|
+
if isinstance(self.schema, dict) and "type" in self.schema:
|
121
|
+
params["schema"] = self.schema
|
122
|
+
elif hasattr(self.schema, "dict") and "type" in self.schema.dict():
|
123
|
+
params["schema"] = self.schema.dict()
|
124
|
+
else:
|
125
|
+
# Skip invalid schema without raising an error
|
126
|
+
pass
|
127
|
+
except Exception as e: # noqa: BLE001
|
128
|
+
logger.error(f"Invalid schema: {e!s}")
|
129
|
+
|
130
|
+
try:
|
131
|
+
app = FirecrawlApp(api_key=self.api_key)
|
132
|
+
extract_result = app.extract(urls, params=params)
|
133
|
+
return Data(data=extract_result)
|
134
|
+
except Exception as e:
|
135
|
+
msg = f"Error during extraction: {e!s}"
|
136
|
+
raise ValueError(msg) from e
|
@@ -0,0 +1,89 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.io import (
|
3
|
+
BoolInput,
|
4
|
+
MultilineInput,
|
5
|
+
Output,
|
6
|
+
SecretStrInput,
|
7
|
+
)
|
8
|
+
from lfx.schema.data import Data
|
9
|
+
|
10
|
+
|
11
|
+
class FirecrawlMapApi(Component):
|
12
|
+
display_name: str = "Firecrawl Map API"
|
13
|
+
description: str = "Maps a URL and returns the results."
|
14
|
+
name = "FirecrawlMapApi"
|
15
|
+
|
16
|
+
documentation: str = "https://docs.firecrawl.dev/api-reference/endpoint/map"
|
17
|
+
|
18
|
+
inputs = [
|
19
|
+
SecretStrInput(
|
20
|
+
name="api_key",
|
21
|
+
display_name="API Key",
|
22
|
+
required=True,
|
23
|
+
password=True,
|
24
|
+
info="The API key to use Firecrawl API.",
|
25
|
+
),
|
26
|
+
MultilineInput(
|
27
|
+
name="urls",
|
28
|
+
display_name="URLs",
|
29
|
+
required=True,
|
30
|
+
info="List of URLs to create maps from (separated by commas or new lines).",
|
31
|
+
tool_mode=True,
|
32
|
+
),
|
33
|
+
BoolInput(
|
34
|
+
name="ignore_sitemap",
|
35
|
+
display_name="Ignore Sitemap",
|
36
|
+
info="When true, the sitemap.xml file will be ignored during crawling.",
|
37
|
+
),
|
38
|
+
BoolInput(
|
39
|
+
name="sitemap_only",
|
40
|
+
display_name="Sitemap Only",
|
41
|
+
info="When true, only links found in the sitemap will be returned.",
|
42
|
+
),
|
43
|
+
BoolInput(
|
44
|
+
name="include_subdomains",
|
45
|
+
display_name="Include Subdomains",
|
46
|
+
info="When true, subdomains of the provided URL will also be scanned.",
|
47
|
+
),
|
48
|
+
]
|
49
|
+
|
50
|
+
outputs = [
|
51
|
+
Output(display_name="Data", name="data", method="map"),
|
52
|
+
]
|
53
|
+
|
54
|
+
def map(self) -> Data:
|
55
|
+
try:
|
56
|
+
from firecrawl import FirecrawlApp
|
57
|
+
except ImportError as e:
|
58
|
+
msg = "Could not import firecrawl integration package. Please install it with `pip install firecrawl-py`."
|
59
|
+
raise ImportError(msg) from e
|
60
|
+
|
61
|
+
# Validate URLs
|
62
|
+
if not self.urls:
|
63
|
+
msg = "URLs are required"
|
64
|
+
raise ValueError(msg)
|
65
|
+
|
66
|
+
# Split and validate URLs (handle both commas and newlines)
|
67
|
+
urls = [url.strip() for url in self.urls.replace("\n", ",").split(",") if url.strip()]
|
68
|
+
if not urls:
|
69
|
+
msg = "No valid URLs provided"
|
70
|
+
raise ValueError(msg)
|
71
|
+
|
72
|
+
params = {
|
73
|
+
"ignoreSitemap": self.ignore_sitemap,
|
74
|
+
"sitemapOnly": self.sitemap_only,
|
75
|
+
"includeSubdomains": self.include_subdomains,
|
76
|
+
}
|
77
|
+
|
78
|
+
app = FirecrawlApp(api_key=self.api_key)
|
79
|
+
|
80
|
+
# Map all provided URLs and combine results
|
81
|
+
combined_links = []
|
82
|
+
for url in urls:
|
83
|
+
result = app.map_url(url, params=params)
|
84
|
+
if isinstance(result, dict) and "links" in result:
|
85
|
+
combined_links.extend(result["links"])
|
86
|
+
|
87
|
+
map_result = {"success": True, "links": combined_links}
|
88
|
+
|
89
|
+
return Data(data=map_result)
|
@@ -0,0 +1,73 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.io import (
|
3
|
+
DataInput,
|
4
|
+
IntInput,
|
5
|
+
MultilineInput,
|
6
|
+
Output,
|
7
|
+
SecretStrInput,
|
8
|
+
)
|
9
|
+
from lfx.schema.data import Data
|
10
|
+
|
11
|
+
|
12
|
+
class FirecrawlScrapeApi(Component):
|
13
|
+
display_name: str = "Firecrawl Scrape API"
|
14
|
+
description: str = "Scrapes a URL and returns the results."
|
15
|
+
name = "FirecrawlScrapeApi"
|
16
|
+
|
17
|
+
documentation: str = "https://docs.firecrawl.dev/api-reference/endpoint/scrape"
|
18
|
+
|
19
|
+
inputs = [
|
20
|
+
SecretStrInput(
|
21
|
+
name="api_key",
|
22
|
+
display_name="API Key",
|
23
|
+
required=True,
|
24
|
+
password=True,
|
25
|
+
info="The API key to use Firecrawl API.",
|
26
|
+
),
|
27
|
+
MultilineInput(
|
28
|
+
name="url",
|
29
|
+
display_name="URL",
|
30
|
+
required=True,
|
31
|
+
info="The URL to scrape.",
|
32
|
+
tool_mode=True,
|
33
|
+
),
|
34
|
+
IntInput(
|
35
|
+
name="timeout",
|
36
|
+
display_name="Timeout",
|
37
|
+
info="Timeout in milliseconds for the request.",
|
38
|
+
),
|
39
|
+
DataInput(
|
40
|
+
name="scrapeOptions",
|
41
|
+
display_name="Scrape Options",
|
42
|
+
info="The page options to send with the request.",
|
43
|
+
),
|
44
|
+
DataInput(
|
45
|
+
name="extractorOptions",
|
46
|
+
display_name="Extractor Options",
|
47
|
+
info="The extractor options to send with the request.",
|
48
|
+
),
|
49
|
+
]
|
50
|
+
|
51
|
+
outputs = [
|
52
|
+
Output(display_name="Data", name="data", method="scrape"),
|
53
|
+
]
|
54
|
+
|
55
|
+
def scrape(self) -> Data:
|
56
|
+
try:
|
57
|
+
from firecrawl import FirecrawlApp
|
58
|
+
except ImportError as e:
|
59
|
+
msg = "Could not import firecrawl integration package. Please install it with `pip install firecrawl-py`."
|
60
|
+
raise ImportError(msg) from e
|
61
|
+
|
62
|
+
params = self.scrapeOptions.__dict__.get("data", {}) if self.scrapeOptions else {}
|
63
|
+
extractor_options_dict = self.extractorOptions.__dict__.get("data", {}) if self.extractorOptions else {}
|
64
|
+
if extractor_options_dict:
|
65
|
+
params["extract"] = extractor_options_dict
|
66
|
+
|
67
|
+
# Set default values for parameters
|
68
|
+
params.setdefault("formats", ["markdown"]) # Default output format
|
69
|
+
params.setdefault("onlyMainContent", True) # Default to only main content
|
70
|
+
|
71
|
+
app = FirecrawlApp(api_key=self.api_key)
|
72
|
+
results = app.scrape_url(self.url, params=params)
|
73
|
+
return Data(data=results)
|
@@ -0,0 +1,262 @@
|
|
1
|
+
import re
|
2
|
+
import tempfile
|
3
|
+
from contextlib import asynccontextmanager
|
4
|
+
from fnmatch import fnmatch
|
5
|
+
from pathlib import Path
|
6
|
+
|
7
|
+
import anyio
|
8
|
+
from langchain_community.document_loaders.git import GitLoader
|
9
|
+
|
10
|
+
from lfx.custom.custom_component.component import Component
|
11
|
+
from lfx.io import DropdownInput, MessageTextInput, Output
|
12
|
+
from lfx.schema.data import Data
|
13
|
+
|
14
|
+
|
15
|
+
class GitLoaderComponent(Component):
|
16
|
+
display_name = "Git"
|
17
|
+
description = (
|
18
|
+
"Load and filter documents from a local or remote Git repository. "
|
19
|
+
"Use a local repo path or clone from a remote URL."
|
20
|
+
)
|
21
|
+
trace_type = "tool"
|
22
|
+
icon = "GitLoader"
|
23
|
+
|
24
|
+
inputs = [
|
25
|
+
DropdownInput(
|
26
|
+
name="repo_source",
|
27
|
+
display_name="Repository Source",
|
28
|
+
options=["Local", "Remote"],
|
29
|
+
required=True,
|
30
|
+
info="Select whether to use a local repo path or clone from a remote URL.",
|
31
|
+
real_time_refresh=True,
|
32
|
+
),
|
33
|
+
MessageTextInput(
|
34
|
+
name="repo_path",
|
35
|
+
display_name="Local Repository Path",
|
36
|
+
required=False,
|
37
|
+
info="The local path to the existing Git repository (used if 'Local' is selected).",
|
38
|
+
dynamic=True,
|
39
|
+
show=False,
|
40
|
+
),
|
41
|
+
MessageTextInput(
|
42
|
+
name="clone_url",
|
43
|
+
display_name="Clone URL",
|
44
|
+
required=False,
|
45
|
+
info="The URL of the Git repository to clone (used if 'Clone' is selected).",
|
46
|
+
dynamic=True,
|
47
|
+
show=False,
|
48
|
+
),
|
49
|
+
MessageTextInput(
|
50
|
+
name="branch",
|
51
|
+
display_name="Branch",
|
52
|
+
required=False,
|
53
|
+
value="main",
|
54
|
+
info="The branch to load files from. Defaults to 'main'.",
|
55
|
+
),
|
56
|
+
MessageTextInput(
|
57
|
+
name="file_filter",
|
58
|
+
display_name="File Filter",
|
59
|
+
required=False,
|
60
|
+
advanced=True,
|
61
|
+
info=(
|
62
|
+
"Patterns to filter files. For example:\n"
|
63
|
+
"Include only .py files: '*.py'\n"
|
64
|
+
"Exclude .py files: '!*.py'\n"
|
65
|
+
"Multiple patterns can be separated by commas."
|
66
|
+
),
|
67
|
+
),
|
68
|
+
MessageTextInput(
|
69
|
+
name="content_filter",
|
70
|
+
display_name="Content Filter",
|
71
|
+
required=False,
|
72
|
+
advanced=True,
|
73
|
+
info="A regex pattern to filter files based on their content.",
|
74
|
+
),
|
75
|
+
]
|
76
|
+
|
77
|
+
outputs = [
|
78
|
+
Output(name="data", display_name="Data", method="load_documents"),
|
79
|
+
]
|
80
|
+
|
81
|
+
@staticmethod
|
82
|
+
def is_binary(file_path: str | Path) -> bool:
|
83
|
+
"""Check if a file is binary by looking for null bytes."""
|
84
|
+
try:
|
85
|
+
with Path(file_path).open("rb") as file:
|
86
|
+
content = file.read(1024)
|
87
|
+
return b"\x00" in content
|
88
|
+
except Exception: # noqa: BLE001
|
89
|
+
return True
|
90
|
+
|
91
|
+
@staticmethod
|
92
|
+
def check_file_patterns(file_path: str | Path, patterns: str) -> bool:
|
93
|
+
"""Check if a file matches the given patterns.
|
94
|
+
|
95
|
+
Args:
|
96
|
+
file_path: Path to the file to check
|
97
|
+
patterns: Comma-separated list of glob patterns
|
98
|
+
|
99
|
+
Returns:
|
100
|
+
bool: True if file should be included, False if excluded
|
101
|
+
"""
|
102
|
+
# Handle empty or whitespace-only patterns
|
103
|
+
if not patterns or patterns.isspace():
|
104
|
+
return True
|
105
|
+
|
106
|
+
path_str = str(file_path)
|
107
|
+
file_name = Path(path_str).name
|
108
|
+
pattern_list: list[str] = [pattern.strip() for pattern in patterns.split(",") if pattern.strip()]
|
109
|
+
|
110
|
+
# If no valid patterns after stripping, treat as include all
|
111
|
+
if not pattern_list:
|
112
|
+
return True
|
113
|
+
|
114
|
+
# Process exclusion patterns first
|
115
|
+
for pattern in pattern_list:
|
116
|
+
if pattern.startswith("!"):
|
117
|
+
# For exclusions, match against both full path and filename
|
118
|
+
exclude_pattern = pattern[1:]
|
119
|
+
if fnmatch(path_str, exclude_pattern) or fnmatch(file_name, exclude_pattern):
|
120
|
+
return False
|
121
|
+
|
122
|
+
# Then check inclusion patterns
|
123
|
+
include_patterns = [p for p in pattern_list if not p.startswith("!")]
|
124
|
+
# If no include patterns, treat as include all
|
125
|
+
if not include_patterns:
|
126
|
+
return True
|
127
|
+
|
128
|
+
# For inclusions, match against both full path and filename
|
129
|
+
return any(fnmatch(path_str, pattern) or fnmatch(file_name, pattern) for pattern in include_patterns)
|
130
|
+
|
131
|
+
@staticmethod
|
132
|
+
def check_content_pattern(file_path: str | Path, pattern: str) -> bool:
|
133
|
+
"""Check if file content matches the given regex pattern.
|
134
|
+
|
135
|
+
Args:
|
136
|
+
file_path: Path to the file to check
|
137
|
+
pattern: Regex pattern to match against content
|
138
|
+
|
139
|
+
Returns:
|
140
|
+
bool: True if content matches, False otherwise
|
141
|
+
"""
|
142
|
+
try:
|
143
|
+
# Check if file is binary
|
144
|
+
with Path(file_path).open("rb") as file:
|
145
|
+
content = file.read(1024)
|
146
|
+
if b"\x00" in content:
|
147
|
+
return False
|
148
|
+
|
149
|
+
# Try to compile the regex pattern first
|
150
|
+
try:
|
151
|
+
# Use the MULTILINE flag to better handle text content
|
152
|
+
content_regex = re.compile(pattern, re.MULTILINE)
|
153
|
+
# Test the pattern with a simple string to catch syntax errors
|
154
|
+
test_str = "test\nstring"
|
155
|
+
if not content_regex.search(test_str):
|
156
|
+
# Pattern is valid but doesn't match test string
|
157
|
+
pass
|
158
|
+
except (re.error, TypeError, ValueError):
|
159
|
+
return False
|
160
|
+
|
161
|
+
# If not binary and regex is valid, check content
|
162
|
+
with Path(file_path).open(encoding="utf-8") as file:
|
163
|
+
file_content = file.read()
|
164
|
+
return bool(content_regex.search(file_content))
|
165
|
+
except (OSError, UnicodeDecodeError):
|
166
|
+
return False
|
167
|
+
|
168
|
+
def build_combined_filter(self, file_filter_patterns: str | None = None, content_filter_pattern: str | None = None):
|
169
|
+
"""Build a combined filter function from file and content patterns.
|
170
|
+
|
171
|
+
Args:
|
172
|
+
file_filter_patterns: Comma-separated glob patterns
|
173
|
+
content_filter_pattern: Regex pattern for content
|
174
|
+
|
175
|
+
Returns:
|
176
|
+
callable: Filter function that takes a file path and returns bool
|
177
|
+
"""
|
178
|
+
|
179
|
+
def combined_filter(file_path: str) -> bool:
|
180
|
+
try:
|
181
|
+
path = Path(file_path)
|
182
|
+
|
183
|
+
# Check if file exists and is readable
|
184
|
+
if not path.exists():
|
185
|
+
return False
|
186
|
+
|
187
|
+
# Check if file is binary
|
188
|
+
if self.is_binary(path):
|
189
|
+
return False
|
190
|
+
|
191
|
+
# Apply file pattern filters
|
192
|
+
if file_filter_patterns and not self.check_file_patterns(path, file_filter_patterns):
|
193
|
+
return False
|
194
|
+
|
195
|
+
# Apply content filter
|
196
|
+
return not (content_filter_pattern and not self.check_content_pattern(path, content_filter_pattern))
|
197
|
+
except Exception: # noqa: BLE001
|
198
|
+
return False
|
199
|
+
|
200
|
+
return combined_filter
|
201
|
+
|
202
|
+
@asynccontextmanager
|
203
|
+
async def temp_clone_dir(self):
|
204
|
+
"""Context manager for handling temporary clone directory."""
|
205
|
+
temp_dir = None
|
206
|
+
try:
|
207
|
+
temp_dir = tempfile.mkdtemp(prefix="langflow_clone_")
|
208
|
+
yield temp_dir
|
209
|
+
finally:
|
210
|
+
if temp_dir:
|
211
|
+
await anyio.Path(temp_dir).rmdir()
|
212
|
+
|
213
|
+
def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None) -> dict:
|
214
|
+
# Hide fields by default
|
215
|
+
build_config["repo_path"]["show"] = False
|
216
|
+
build_config["clone_url"]["show"] = False
|
217
|
+
|
218
|
+
if field_name == "repo_source":
|
219
|
+
if field_value == "Local":
|
220
|
+
build_config["repo_path"]["show"] = True
|
221
|
+
build_config["repo_path"]["required"] = True
|
222
|
+
build_config["clone_url"]["required"] = False
|
223
|
+
elif field_value == "Remote":
|
224
|
+
build_config["clone_url"]["show"] = True
|
225
|
+
build_config["clone_url"]["required"] = True
|
226
|
+
build_config["repo_path"]["required"] = False
|
227
|
+
|
228
|
+
return build_config
|
229
|
+
|
230
|
+
async def build_gitloader(self) -> GitLoader:
|
231
|
+
file_filter_patterns = getattr(self, "file_filter", None)
|
232
|
+
content_filter_pattern = getattr(self, "content_filter", None)
|
233
|
+
|
234
|
+
combined_filter = self.build_combined_filter(file_filter_patterns, content_filter_pattern)
|
235
|
+
|
236
|
+
repo_source = getattr(self, "repo_source", None)
|
237
|
+
if repo_source == "Local":
|
238
|
+
repo_path = self.repo_path
|
239
|
+
clone_url = None
|
240
|
+
else:
|
241
|
+
# Clone source
|
242
|
+
clone_url = self.clone_url
|
243
|
+
async with self.temp_clone_dir() as temp_dir:
|
244
|
+
repo_path = temp_dir
|
245
|
+
|
246
|
+
# Only pass branch if it's explicitly set
|
247
|
+
branch = getattr(self, "branch", None)
|
248
|
+
if not branch:
|
249
|
+
branch = None
|
250
|
+
|
251
|
+
return GitLoader(
|
252
|
+
repo_path=repo_path,
|
253
|
+
clone_url=clone_url if repo_source == "Remote" else None,
|
254
|
+
branch=branch,
|
255
|
+
file_filter=combined_filter,
|
256
|
+
)
|
257
|
+
|
258
|
+
async def load_documents(self) -> list[Data]:
|
259
|
+
gitloader = await self.build_gitloader()
|
260
|
+
data = [Data.from_document(doc) async for doc in gitloader.alazy_load()]
|
261
|
+
self.status = data
|
262
|
+
return data
|