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,115 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
from langchain_community.utilities.serpapi import SerpAPIWrapper
|
4
|
+
from langchain_core.tools import ToolException
|
5
|
+
from pydantic import BaseModel, Field
|
6
|
+
|
7
|
+
from lfx.custom.custom_component.component import Component
|
8
|
+
from lfx.inputs.inputs import DictInput, IntInput, MultilineInput, SecretStrInput
|
9
|
+
from lfx.io import Output
|
10
|
+
from lfx.log.logger import logger
|
11
|
+
from lfx.schema.data import Data
|
12
|
+
from lfx.schema.message import Message
|
13
|
+
|
14
|
+
|
15
|
+
class SerpAPISchema(BaseModel):
|
16
|
+
"""Schema for SerpAPI search parameters."""
|
17
|
+
|
18
|
+
query: str = Field(..., description="The search query")
|
19
|
+
params: dict[str, Any] | None = Field(
|
20
|
+
default={
|
21
|
+
"engine": "google",
|
22
|
+
"google_domain": "google.com",
|
23
|
+
"gl": "us",
|
24
|
+
"hl": "en",
|
25
|
+
},
|
26
|
+
description="Additional search parameters",
|
27
|
+
)
|
28
|
+
max_results: int = Field(5, description="Maximum number of results to return")
|
29
|
+
max_snippet_length: int = Field(100, description="Maximum length of each result snippet")
|
30
|
+
|
31
|
+
|
32
|
+
class SerpComponent(Component):
|
33
|
+
display_name = "Serp Search API"
|
34
|
+
description = "Call Serp Search API with result limiting"
|
35
|
+
name = "Serp"
|
36
|
+
icon = "SerpSearch"
|
37
|
+
|
38
|
+
inputs = [
|
39
|
+
SecretStrInput(name="serpapi_api_key", display_name="SerpAPI API Key", required=True),
|
40
|
+
MultilineInput(
|
41
|
+
name="input_value",
|
42
|
+
display_name="Input",
|
43
|
+
tool_mode=True,
|
44
|
+
),
|
45
|
+
DictInput(name="search_params", display_name="Parameters", advanced=True, is_list=True),
|
46
|
+
IntInput(name="max_results", display_name="Max Results", value=5, advanced=True),
|
47
|
+
IntInput(name="max_snippet_length", display_name="Max Snippet Length", value=100, advanced=True),
|
48
|
+
]
|
49
|
+
|
50
|
+
outputs = [
|
51
|
+
Output(display_name="Data", name="data", method="fetch_content"),
|
52
|
+
Output(display_name="Text", name="text", method="fetch_content_text"),
|
53
|
+
]
|
54
|
+
|
55
|
+
def _build_wrapper(self, params: dict[str, Any] | None = None) -> SerpAPIWrapper:
|
56
|
+
"""Build a SerpAPIWrapper with the provided parameters."""
|
57
|
+
params = params or {}
|
58
|
+
if params:
|
59
|
+
return SerpAPIWrapper(
|
60
|
+
serpapi_api_key=self.serpapi_api_key,
|
61
|
+
params=params,
|
62
|
+
)
|
63
|
+
return SerpAPIWrapper(serpapi_api_key=self.serpapi_api_key)
|
64
|
+
|
65
|
+
def run_model(self) -> list[Data]:
|
66
|
+
return self.fetch_content()
|
67
|
+
|
68
|
+
def fetch_content(self) -> list[Data]:
|
69
|
+
wrapper = self._build_wrapper(self.search_params)
|
70
|
+
|
71
|
+
def search_func(
|
72
|
+
query: str, params: dict[str, Any] | None = None, max_results: int = 5, max_snippet_length: int = 100
|
73
|
+
) -> list[Data]:
|
74
|
+
try:
|
75
|
+
local_wrapper = wrapper
|
76
|
+
if params:
|
77
|
+
local_wrapper = self._build_wrapper(params)
|
78
|
+
|
79
|
+
full_results = local_wrapper.results(query)
|
80
|
+
organic_results = full_results.get("organic_results", [])[:max_results]
|
81
|
+
|
82
|
+
limited_results = [
|
83
|
+
Data(
|
84
|
+
text=result.get("snippet", ""),
|
85
|
+
data={
|
86
|
+
"title": result.get("title", "")[:max_snippet_length],
|
87
|
+
"link": result.get("link", ""),
|
88
|
+
"snippet": result.get("snippet", "")[:max_snippet_length],
|
89
|
+
},
|
90
|
+
)
|
91
|
+
for result in organic_results
|
92
|
+
]
|
93
|
+
|
94
|
+
except Exception as e:
|
95
|
+
error_message = f"Error in SerpAPI search: {e!s}"
|
96
|
+
logger.debug(error_message)
|
97
|
+
raise ToolException(error_message) from e
|
98
|
+
return limited_results
|
99
|
+
|
100
|
+
results = search_func(
|
101
|
+
self.input_value,
|
102
|
+
params=self.search_params,
|
103
|
+
max_results=self.max_results,
|
104
|
+
max_snippet_length=self.max_snippet_length,
|
105
|
+
)
|
106
|
+
self.status = results
|
107
|
+
return results
|
108
|
+
|
109
|
+
def fetch_content_text(self) -> Message:
|
110
|
+
data = self.fetch_content()
|
111
|
+
result_string = ""
|
112
|
+
for item in data:
|
113
|
+
result_string += item.text + "\n"
|
114
|
+
self.status = result_string
|
115
|
+
return Message(text=result_string)
|
@@ -0,0 +1,34 @@
|
|
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 .supabase import SupabaseVectorStoreComponent
|
9
|
+
|
10
|
+
_dynamic_imports = {
|
11
|
+
"SupabaseVectorStoreComponent": "supabase",
|
12
|
+
}
|
13
|
+
|
14
|
+
__all__ = [
|
15
|
+
"SupabaseVectorStoreComponent",
|
16
|
+
]
|
17
|
+
|
18
|
+
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
20
|
+
"""Lazily import Supabase components on attribute access."""
|
21
|
+
if attr_name not in _dynamic_imports:
|
22
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
23
|
+
raise AttributeError(msg)
|
24
|
+
try:
|
25
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
26
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
27
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
28
|
+
raise AttributeError(msg) from e
|
29
|
+
globals()[attr_name] = result
|
30
|
+
return result
|
31
|
+
|
32
|
+
|
33
|
+
def __dir__() -> list[str]:
|
34
|
+
return list(__all__)
|
@@ -0,0 +1,76 @@
|
|
1
|
+
from langchain_community.vectorstores import SupabaseVectorStore
|
2
|
+
from supabase.client import Client, create_client
|
3
|
+
|
4
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
5
|
+
from lfx.helpers.data import docs_to_data
|
6
|
+
from lfx.io import HandleInput, IntInput, SecretStrInput, StrInput
|
7
|
+
from lfx.schema.data import Data
|
8
|
+
|
9
|
+
|
10
|
+
class SupabaseVectorStoreComponent(LCVectorStoreComponent):
|
11
|
+
display_name = "Supabase"
|
12
|
+
description = "Supabase Vector Store with search capabilities"
|
13
|
+
name = "SupabaseVectorStore"
|
14
|
+
icon = "Supabase"
|
15
|
+
|
16
|
+
inputs = [
|
17
|
+
StrInput(name="supabase_url", display_name="Supabase URL", required=True),
|
18
|
+
SecretStrInput(name="supabase_service_key", display_name="Supabase Service Key", required=True),
|
19
|
+
StrInput(name="table_name", display_name="Table Name", advanced=True),
|
20
|
+
StrInput(name="query_name", display_name="Query Name"),
|
21
|
+
*LCVectorStoreComponent.inputs,
|
22
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
23
|
+
IntInput(
|
24
|
+
name="number_of_results",
|
25
|
+
display_name="Number of Results",
|
26
|
+
info="Number of results to return.",
|
27
|
+
value=4,
|
28
|
+
advanced=True,
|
29
|
+
),
|
30
|
+
]
|
31
|
+
|
32
|
+
@check_cached_vector_store
|
33
|
+
def build_vector_store(self) -> SupabaseVectorStore:
|
34
|
+
supabase: Client = create_client(self.supabase_url, supabase_key=self.supabase_service_key)
|
35
|
+
|
36
|
+
# Convert DataFrame to Data if needed using parent's method
|
37
|
+
self.ingest_data = self._prepare_ingest_data()
|
38
|
+
|
39
|
+
documents = []
|
40
|
+
for _input in self.ingest_data or []:
|
41
|
+
if isinstance(_input, Data):
|
42
|
+
documents.append(_input.to_lc_document())
|
43
|
+
else:
|
44
|
+
documents.append(_input)
|
45
|
+
|
46
|
+
if documents:
|
47
|
+
supabase_vs = SupabaseVectorStore.from_documents(
|
48
|
+
documents=documents,
|
49
|
+
embedding=self.embedding,
|
50
|
+
query_name=self.query_name,
|
51
|
+
client=supabase,
|
52
|
+
table_name=self.table_name,
|
53
|
+
)
|
54
|
+
else:
|
55
|
+
supabase_vs = SupabaseVectorStore(
|
56
|
+
client=supabase,
|
57
|
+
embedding=self.embedding,
|
58
|
+
table_name=self.table_name,
|
59
|
+
query_name=self.query_name,
|
60
|
+
)
|
61
|
+
|
62
|
+
return supabase_vs
|
63
|
+
|
64
|
+
def search_documents(self) -> list[Data]:
|
65
|
+
vector_store = self.build_vector_store()
|
66
|
+
|
67
|
+
if self.search_query and isinstance(self.search_query, str) and self.search_query.strip():
|
68
|
+
docs = vector_store.similarity_search(
|
69
|
+
query=self.search_query,
|
70
|
+
k=self.number_of_results,
|
71
|
+
)
|
72
|
+
|
73
|
+
data = docs_to_data(docs)
|
74
|
+
self.status = data
|
75
|
+
return data
|
76
|
+
return []
|
@@ -0,0 +1,117 @@
|
|
1
|
+
import httpx
|
2
|
+
|
3
|
+
from lfx.custom import Component
|
4
|
+
from lfx.io import BoolInput, DropdownInput, MessageTextInput, Output, SecretStrInput
|
5
|
+
from lfx.log.logger import logger
|
6
|
+
from lfx.schema import Data
|
7
|
+
from lfx.schema.dataframe import DataFrame
|
8
|
+
|
9
|
+
|
10
|
+
class TavilyExtractComponent(Component):
|
11
|
+
"""Separate component specifically for Tavily Extract functionality."""
|
12
|
+
|
13
|
+
display_name = "Tavily Extract API"
|
14
|
+
description = """**Tavily Extract** extract raw content from URLs."""
|
15
|
+
icon = "TavilyIcon"
|
16
|
+
|
17
|
+
inputs = [
|
18
|
+
SecretStrInput(
|
19
|
+
name="api_key",
|
20
|
+
display_name="Tavily API Key",
|
21
|
+
required=True,
|
22
|
+
info="Your Tavily API Key.",
|
23
|
+
),
|
24
|
+
MessageTextInput(
|
25
|
+
name="urls",
|
26
|
+
display_name="URLs",
|
27
|
+
info="Comma-separated list of URLs to extract content from.",
|
28
|
+
required=True,
|
29
|
+
),
|
30
|
+
DropdownInput(
|
31
|
+
name="extract_depth",
|
32
|
+
display_name="Extract Depth",
|
33
|
+
info="The depth of the extraction process.",
|
34
|
+
options=["basic", "advanced"],
|
35
|
+
value="basic",
|
36
|
+
advanced=True,
|
37
|
+
),
|
38
|
+
BoolInput(
|
39
|
+
name="include_images",
|
40
|
+
display_name="Include Images",
|
41
|
+
info="Include a list of images extracted from the URLs.",
|
42
|
+
value=False,
|
43
|
+
advanced=True,
|
44
|
+
),
|
45
|
+
]
|
46
|
+
|
47
|
+
outputs = [
|
48
|
+
Output(display_name="DataFrame", name="dataframe", method="fetch_content"),
|
49
|
+
]
|
50
|
+
|
51
|
+
def run_model(self) -> DataFrame:
|
52
|
+
return self.fetch_content_dataframe()
|
53
|
+
|
54
|
+
def fetch_content(self) -> list[Data]:
|
55
|
+
"""Fetches and processes extracted content into a list of Data objects."""
|
56
|
+
try:
|
57
|
+
# Split URLs by comma and clean them
|
58
|
+
urls = [url.strip() for url in (self.urls or "").split(",") if url.strip()]
|
59
|
+
if not urls:
|
60
|
+
error_message = "No valid URLs provided"
|
61
|
+
logger.error(error_message)
|
62
|
+
return [Data(text=error_message, data={"error": error_message})]
|
63
|
+
|
64
|
+
url = "https://api.tavily.com/extract"
|
65
|
+
headers = {
|
66
|
+
"content-type": "application/json",
|
67
|
+
"accept": "application/json",
|
68
|
+
"Authorization": f"Bearer {self.api_key}",
|
69
|
+
}
|
70
|
+
payload = {
|
71
|
+
"urls": urls,
|
72
|
+
"extract_depth": self.extract_depth,
|
73
|
+
"include_images": self.include_images,
|
74
|
+
}
|
75
|
+
|
76
|
+
with httpx.Client(timeout=90.0) as client:
|
77
|
+
response = client.post(url, json=payload, headers=headers)
|
78
|
+
response.raise_for_status()
|
79
|
+
|
80
|
+
except httpx.TimeoutException as exc:
|
81
|
+
error_message = f"Request timed out (90s): {exc}"
|
82
|
+
logger.error(error_message)
|
83
|
+
return [Data(text=error_message, data={"error": error_message})]
|
84
|
+
except httpx.HTTPStatusError as exc:
|
85
|
+
error_message = f"HTTP error occurred: {exc.response.status_code} - {exc.response.text}"
|
86
|
+
logger.error(error_message)
|
87
|
+
return [Data(text=error_message, data={"error": error_message})]
|
88
|
+
except (ValueError, KeyError, AttributeError, httpx.RequestError) as exc:
|
89
|
+
error_message = f"Data processing error: {exc}"
|
90
|
+
logger.error(error_message)
|
91
|
+
return [Data(text=error_message, data={"error": error_message})]
|
92
|
+
else:
|
93
|
+
extract_results = response.json()
|
94
|
+
data_results = []
|
95
|
+
|
96
|
+
# Process successful extractions
|
97
|
+
for result in extract_results.get("results", []):
|
98
|
+
raw_content = result.get("raw_content", "")
|
99
|
+
images = result.get("images", [])
|
100
|
+
result_data = {"url": result.get("url"), "raw_content": raw_content, "images": images}
|
101
|
+
data_results.append(Data(text=raw_content, data=result_data))
|
102
|
+
|
103
|
+
# Process failed extractions
|
104
|
+
if extract_results.get("failed_results"):
|
105
|
+
data_results.append(
|
106
|
+
Data(
|
107
|
+
text="Failed extractions",
|
108
|
+
data={"failed_results": extract_results["failed_results"]},
|
109
|
+
)
|
110
|
+
)
|
111
|
+
|
112
|
+
self.status = data_results
|
113
|
+
return data_results
|
114
|
+
|
115
|
+
def fetch_content_dataframe(self) -> DataFrame:
|
116
|
+
data = self.fetch_content()
|
117
|
+
return DataFrame(data)
|
@@ -0,0 +1,212 @@
|
|
1
|
+
import httpx
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.inputs.inputs import BoolInput, DropdownInput, IntInput, MessageTextInput, SecretStrInput
|
5
|
+
from lfx.log.logger import logger
|
6
|
+
from lfx.schema.data import Data
|
7
|
+
from lfx.schema.dataframe import DataFrame
|
8
|
+
from lfx.template.field.base import Output
|
9
|
+
|
10
|
+
|
11
|
+
class TavilySearchComponent(Component):
|
12
|
+
display_name = "Tavily Search API"
|
13
|
+
description = """**Tavily Search** is a search engine optimized for LLMs and RAG, \
|
14
|
+
aimed at efficient, quick, and persistent search results."""
|
15
|
+
icon = "TavilyIcon"
|
16
|
+
|
17
|
+
inputs = [
|
18
|
+
SecretStrInput(
|
19
|
+
name="api_key",
|
20
|
+
display_name="Tavily API Key",
|
21
|
+
required=True,
|
22
|
+
info="Your Tavily API Key.",
|
23
|
+
),
|
24
|
+
MessageTextInput(
|
25
|
+
name="query",
|
26
|
+
display_name="Search Query",
|
27
|
+
info="The search query you want to execute with Tavily.",
|
28
|
+
tool_mode=True,
|
29
|
+
),
|
30
|
+
DropdownInput(
|
31
|
+
name="search_depth",
|
32
|
+
display_name="Search Depth",
|
33
|
+
info="The depth of the search.",
|
34
|
+
options=["basic", "advanced"],
|
35
|
+
value="advanced",
|
36
|
+
advanced=True,
|
37
|
+
),
|
38
|
+
IntInput(
|
39
|
+
name="chunks_per_source",
|
40
|
+
display_name="Chunks Per Source",
|
41
|
+
info=("The number of content chunks to retrieve from each source (1-3). Only works with advanced search."),
|
42
|
+
value=3,
|
43
|
+
advanced=True,
|
44
|
+
),
|
45
|
+
DropdownInput(
|
46
|
+
name="topic",
|
47
|
+
display_name="Search Topic",
|
48
|
+
info="The category of the search.",
|
49
|
+
options=["general", "news"],
|
50
|
+
value="general",
|
51
|
+
advanced=True,
|
52
|
+
),
|
53
|
+
IntInput(
|
54
|
+
name="days",
|
55
|
+
display_name="Days",
|
56
|
+
info="Number of days back from current date to include. Only available with news topic.",
|
57
|
+
value=7,
|
58
|
+
advanced=True,
|
59
|
+
),
|
60
|
+
IntInput(
|
61
|
+
name="max_results",
|
62
|
+
display_name="Max Results",
|
63
|
+
info="The maximum number of search results to return.",
|
64
|
+
value=5,
|
65
|
+
advanced=True,
|
66
|
+
),
|
67
|
+
BoolInput(
|
68
|
+
name="include_answer",
|
69
|
+
display_name="Include Answer",
|
70
|
+
info="Include a short answer to original query.",
|
71
|
+
value=True,
|
72
|
+
advanced=True,
|
73
|
+
),
|
74
|
+
DropdownInput(
|
75
|
+
name="time_range",
|
76
|
+
display_name="Time Range",
|
77
|
+
info="The time range back from the current date to filter results.",
|
78
|
+
options=["day", "week", "month", "year"],
|
79
|
+
value=None, # Default to None to make it optional
|
80
|
+
advanced=True,
|
81
|
+
),
|
82
|
+
BoolInput(
|
83
|
+
name="include_images",
|
84
|
+
display_name="Include Images",
|
85
|
+
info="Include a list of query-related images in the response.",
|
86
|
+
value=True,
|
87
|
+
advanced=True,
|
88
|
+
),
|
89
|
+
MessageTextInput(
|
90
|
+
name="include_domains",
|
91
|
+
display_name="Include Domains",
|
92
|
+
info="Comma-separated list of domains to include in the search results.",
|
93
|
+
advanced=True,
|
94
|
+
),
|
95
|
+
MessageTextInput(
|
96
|
+
name="exclude_domains",
|
97
|
+
display_name="Exclude Domains",
|
98
|
+
info="Comma-separated list of domains to exclude from the search results.",
|
99
|
+
advanced=True,
|
100
|
+
),
|
101
|
+
BoolInput(
|
102
|
+
name="include_raw_content",
|
103
|
+
display_name="Include Raw Content",
|
104
|
+
info="Include the cleaned and parsed HTML content of each search result.",
|
105
|
+
value=False,
|
106
|
+
advanced=True,
|
107
|
+
),
|
108
|
+
]
|
109
|
+
|
110
|
+
outputs = [
|
111
|
+
Output(display_name="DataFrame", name="dataframe", method="fetch_content_dataframe"),
|
112
|
+
]
|
113
|
+
|
114
|
+
def fetch_content(self) -> list[Data]:
|
115
|
+
try:
|
116
|
+
# Only process domains if they're provided
|
117
|
+
include_domains = None
|
118
|
+
exclude_domains = None
|
119
|
+
|
120
|
+
if self.include_domains:
|
121
|
+
include_domains = [domain.strip() for domain in self.include_domains.split(",") if domain.strip()]
|
122
|
+
|
123
|
+
if self.exclude_domains:
|
124
|
+
exclude_domains = [domain.strip() for domain in self.exclude_domains.split(",") if domain.strip()]
|
125
|
+
|
126
|
+
url = "https://api.tavily.com/search"
|
127
|
+
headers = {
|
128
|
+
"content-type": "application/json",
|
129
|
+
"accept": "application/json",
|
130
|
+
}
|
131
|
+
|
132
|
+
payload = {
|
133
|
+
"api_key": self.api_key,
|
134
|
+
"query": self.query,
|
135
|
+
"search_depth": self.search_depth,
|
136
|
+
"topic": self.topic,
|
137
|
+
"max_results": self.max_results,
|
138
|
+
"include_images": self.include_images,
|
139
|
+
"include_answer": self.include_answer,
|
140
|
+
"include_raw_content": self.include_raw_content,
|
141
|
+
"days": self.days,
|
142
|
+
"time_range": self.time_range,
|
143
|
+
}
|
144
|
+
|
145
|
+
# Only add domains to payload if they exist and have values
|
146
|
+
if include_domains:
|
147
|
+
payload["include_domains"] = include_domains
|
148
|
+
if exclude_domains:
|
149
|
+
payload["exclude_domains"] = exclude_domains
|
150
|
+
|
151
|
+
# Add conditional parameters only if they should be included
|
152
|
+
if self.search_depth == "advanced" and self.chunks_per_source:
|
153
|
+
payload["chunks_per_source"] = self.chunks_per_source
|
154
|
+
|
155
|
+
if self.topic == "news" and self.days:
|
156
|
+
payload["days"] = int(self.days) # Ensure days is an integer
|
157
|
+
|
158
|
+
# Add time_range if it's set
|
159
|
+
if hasattr(self, "time_range") and self.time_range:
|
160
|
+
payload["time_range"] = self.time_range
|
161
|
+
|
162
|
+
# Add timeout handling
|
163
|
+
with httpx.Client(timeout=90.0) as client:
|
164
|
+
response = client.post(url, json=payload, headers=headers)
|
165
|
+
|
166
|
+
response.raise_for_status()
|
167
|
+
search_results = response.json()
|
168
|
+
|
169
|
+
data_results = []
|
170
|
+
|
171
|
+
if self.include_answer and search_results.get("answer"):
|
172
|
+
data_results.append(Data(text=search_results["answer"]))
|
173
|
+
|
174
|
+
for result in search_results.get("results", []):
|
175
|
+
content = result.get("content", "")
|
176
|
+
result_data = {
|
177
|
+
"title": result.get("title"),
|
178
|
+
"url": result.get("url"),
|
179
|
+
"content": content,
|
180
|
+
"score": result.get("score"),
|
181
|
+
}
|
182
|
+
if self.include_raw_content:
|
183
|
+
result_data["raw_content"] = result.get("raw_content")
|
184
|
+
|
185
|
+
data_results.append(Data(text=content, data=result_data))
|
186
|
+
|
187
|
+
if self.include_images and search_results.get("images"):
|
188
|
+
data_results.append(Data(text="Images found", data={"images": search_results["images"]}))
|
189
|
+
|
190
|
+
except httpx.TimeoutException:
|
191
|
+
error_message = "Request timed out (90s). Please try again or adjust parameters."
|
192
|
+
logger.error(error_message)
|
193
|
+
return [Data(text=error_message, data={"error": error_message})]
|
194
|
+
except httpx.HTTPStatusError as exc:
|
195
|
+
error_message = f"HTTP error occurred: {exc.response.status_code} - {exc.response.text}"
|
196
|
+
logger.error(error_message)
|
197
|
+
return [Data(text=error_message, data={"error": error_message})]
|
198
|
+
except httpx.RequestError as exc:
|
199
|
+
error_message = f"Request error occurred: {exc}"
|
200
|
+
logger.error(error_message)
|
201
|
+
return [Data(text=error_message, data={"error": error_message})]
|
202
|
+
except ValueError as exc:
|
203
|
+
error_message = f"Invalid response format: {exc}"
|
204
|
+
logger.error(error_message)
|
205
|
+
return [Data(text=error_message, data={"error": error_message})]
|
206
|
+
else:
|
207
|
+
self.status = data_results
|
208
|
+
return data_results
|
209
|
+
|
210
|
+
def fetch_content_dataframe(self) -> DataFrame:
|
211
|
+
data = self.fetch_content()
|
212
|
+
return DataFrame(data)
|
@@ -0,0 +1,72 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import warnings
|
4
|
+
from typing import TYPE_CHECKING, Any
|
5
|
+
|
6
|
+
from langchain_core._api.deprecation import LangChainDeprecationWarning
|
7
|
+
|
8
|
+
from lfx.components._importing import import_mod
|
9
|
+
|
10
|
+
if TYPE_CHECKING:
|
11
|
+
from .calculator import CalculatorToolComponent
|
12
|
+
from .google_search_api import GoogleSearchAPIComponent
|
13
|
+
from .google_serper_api import GoogleSerperAPIComponent
|
14
|
+
from .python_code_structured_tool import PythonCodeStructuredTool
|
15
|
+
from .python_repl import PythonREPLToolComponent
|
16
|
+
from .search_api import SearchAPIComponent
|
17
|
+
from .searxng import SearXNGToolComponent
|
18
|
+
from .serp_api import SerpAPIComponent
|
19
|
+
from .tavily_search_tool import TavilySearchToolComponent
|
20
|
+
from .wikidata_api import WikidataAPIComponent
|
21
|
+
from .wikipedia_api import WikipediaAPIComponent
|
22
|
+
from .yahoo_finance import YfinanceToolComponent
|
23
|
+
|
24
|
+
_dynamic_imports = {
|
25
|
+
"CalculatorToolComponent": "calculator",
|
26
|
+
"GoogleSearchAPIComponent": "google_search_api",
|
27
|
+
"GoogleSerperAPIComponent": "google_serper_api",
|
28
|
+
"PythonCodeStructuredTool": "python_code_structured_tool",
|
29
|
+
"PythonREPLToolComponent": "python_repl",
|
30
|
+
"SearchAPIComponent": "search_api",
|
31
|
+
"SearXNGToolComponent": "searxng",
|
32
|
+
"SerpAPIComponent": "serp_api",
|
33
|
+
"TavilySearchToolComponent": "tavily_search_tool",
|
34
|
+
"WikidataAPIComponent": "wikidata_api",
|
35
|
+
"WikipediaAPIComponent": "wikipedia_api",
|
36
|
+
"YfinanceToolComponent": "yahoo_finance",
|
37
|
+
}
|
38
|
+
|
39
|
+
__all__ = [
|
40
|
+
"CalculatorToolComponent",
|
41
|
+
"GoogleSearchAPIComponent",
|
42
|
+
"GoogleSerperAPIComponent",
|
43
|
+
"PythonCodeStructuredTool",
|
44
|
+
"PythonREPLToolComponent",
|
45
|
+
"SearXNGToolComponent",
|
46
|
+
"SearchAPIComponent",
|
47
|
+
"SerpAPIComponent",
|
48
|
+
"TavilySearchToolComponent",
|
49
|
+
"WikidataAPIComponent",
|
50
|
+
"WikipediaAPIComponent",
|
51
|
+
"YfinanceToolComponent",
|
52
|
+
]
|
53
|
+
|
54
|
+
|
55
|
+
def __getattr__(attr_name: str) -> Any:
|
56
|
+
"""Lazily import tool 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
|
+
with warnings.catch_warnings():
|
62
|
+
warnings.simplefilter("ignore", LangChainDeprecationWarning)
|
63
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
64
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
65
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
66
|
+
raise AttributeError(msg) from e
|
67
|
+
globals()[attr_name] = result
|
68
|
+
return result
|
69
|
+
|
70
|
+
|
71
|
+
def __dir__() -> list[str]:
|
72
|
+
return list(__all__)
|