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,243 @@
|
|
1
|
+
import json
|
2
|
+
from typing import Any
|
3
|
+
|
4
|
+
from langchain_community.vectorstores import OpenSearchVectorSearch
|
5
|
+
|
6
|
+
from lfx.base.vectorstores.model import LCVectorStoreComponent, check_cached_vector_store
|
7
|
+
from lfx.base.vectorstores.vector_store_connection_decorator import vector_store_connection
|
8
|
+
from lfx.io import (
|
9
|
+
BoolInput,
|
10
|
+
DropdownInput,
|
11
|
+
FloatInput,
|
12
|
+
HandleInput,
|
13
|
+
IntInput,
|
14
|
+
MultilineInput,
|
15
|
+
SecretStrInput,
|
16
|
+
StrInput,
|
17
|
+
)
|
18
|
+
from lfx.schema.data import Data
|
19
|
+
|
20
|
+
|
21
|
+
@vector_store_connection
|
22
|
+
class OpenSearchVectorStoreComponent(LCVectorStoreComponent):
|
23
|
+
"""OpenSearch Vector Store with advanced, customizable search capabilities."""
|
24
|
+
|
25
|
+
display_name: str = "OpenSearch"
|
26
|
+
description: str = "OpenSearch Vector Store with advanced, customizable search capabilities."
|
27
|
+
name = "OpenSearch"
|
28
|
+
icon = "OpenSearch"
|
29
|
+
|
30
|
+
inputs = [
|
31
|
+
StrInput(
|
32
|
+
name="opensearch_url",
|
33
|
+
display_name="OpenSearch URL",
|
34
|
+
value="http://localhost:9200",
|
35
|
+
info="URL for OpenSearch cluster (e.g. https://192.168.1.1:9200).",
|
36
|
+
),
|
37
|
+
StrInput(
|
38
|
+
name="index_name",
|
39
|
+
display_name="Index Name",
|
40
|
+
value="langflow",
|
41
|
+
info="The index name where the vectors will be stored in OpenSearch cluster.",
|
42
|
+
),
|
43
|
+
*LCVectorStoreComponent.inputs,
|
44
|
+
HandleInput(name="embedding", display_name="Embedding", input_types=["Embeddings"]),
|
45
|
+
DropdownInput(
|
46
|
+
name="search_type",
|
47
|
+
display_name="Search Type",
|
48
|
+
options=["similarity", "similarity_score_threshold", "mmr"],
|
49
|
+
value="similarity",
|
50
|
+
advanced=True,
|
51
|
+
),
|
52
|
+
IntInput(
|
53
|
+
name="number_of_results",
|
54
|
+
display_name="Number of Results",
|
55
|
+
info="Number of results to return.",
|
56
|
+
advanced=True,
|
57
|
+
value=4,
|
58
|
+
),
|
59
|
+
FloatInput(
|
60
|
+
name="search_score_threshold",
|
61
|
+
display_name="Search Score Threshold",
|
62
|
+
info="Minimum similarity score threshold for search results.",
|
63
|
+
value=0.0,
|
64
|
+
advanced=True,
|
65
|
+
),
|
66
|
+
StrInput(
|
67
|
+
name="username",
|
68
|
+
display_name="Username",
|
69
|
+
value="admin",
|
70
|
+
advanced=True,
|
71
|
+
),
|
72
|
+
SecretStrInput(
|
73
|
+
name="password",
|
74
|
+
display_name="Password",
|
75
|
+
value="admin",
|
76
|
+
advanced=True,
|
77
|
+
),
|
78
|
+
BoolInput(
|
79
|
+
name="use_ssl",
|
80
|
+
display_name="Use SSL",
|
81
|
+
value=True,
|
82
|
+
advanced=True,
|
83
|
+
),
|
84
|
+
BoolInput(
|
85
|
+
name="verify_certs",
|
86
|
+
display_name="Verify Certificates",
|
87
|
+
value=False,
|
88
|
+
advanced=True,
|
89
|
+
),
|
90
|
+
MultilineInput(
|
91
|
+
name="hybrid_search_query",
|
92
|
+
display_name="Hybrid Search Query",
|
93
|
+
value="",
|
94
|
+
advanced=True,
|
95
|
+
info=(
|
96
|
+
"Provide a custom hybrid search query in JSON format. This allows you to combine "
|
97
|
+
"vector similarity and keyword matching."
|
98
|
+
),
|
99
|
+
),
|
100
|
+
]
|
101
|
+
|
102
|
+
@check_cached_vector_store
|
103
|
+
def build_vector_store(self) -> OpenSearchVectorSearch:
|
104
|
+
"""Builds the OpenSearch Vector Store object."""
|
105
|
+
try:
|
106
|
+
from langchain_community.vectorstores import OpenSearchVectorSearch
|
107
|
+
except ImportError as e:
|
108
|
+
error_message = f"Failed to import required modules: {e}"
|
109
|
+
self.log(error_message)
|
110
|
+
raise ImportError(error_message) from e
|
111
|
+
|
112
|
+
try:
|
113
|
+
opensearch = OpenSearchVectorSearch(
|
114
|
+
index_name=self.index_name,
|
115
|
+
embedding_function=self.embedding,
|
116
|
+
opensearch_url=self.opensearch_url,
|
117
|
+
http_auth=(self.username, self.password),
|
118
|
+
use_ssl=self.use_ssl,
|
119
|
+
verify_certs=self.verify_certs,
|
120
|
+
ssl_assert_hostname=False,
|
121
|
+
ssl_show_warn=False,
|
122
|
+
)
|
123
|
+
except Exception as e:
|
124
|
+
error_message = f"Failed to create OpenSearchVectorSearch instance: {e}"
|
125
|
+
self.log(error_message)
|
126
|
+
raise RuntimeError(error_message) from e
|
127
|
+
|
128
|
+
if self.ingest_data:
|
129
|
+
self._add_documents_to_vector_store(opensearch)
|
130
|
+
|
131
|
+
return opensearch
|
132
|
+
|
133
|
+
def _add_documents_to_vector_store(self, vector_store: "OpenSearchVectorSearch") -> None:
|
134
|
+
"""Adds documents to the Vector Store."""
|
135
|
+
# Convert DataFrame to Data if needed using parent's method
|
136
|
+
self.ingest_data = self._prepare_ingest_data()
|
137
|
+
|
138
|
+
documents = []
|
139
|
+
for _input in self.ingest_data or []:
|
140
|
+
if isinstance(_input, Data):
|
141
|
+
documents.append(_input.to_lc_document())
|
142
|
+
else:
|
143
|
+
error_message = f"Expected Data object, got {type(_input)}"
|
144
|
+
self.log(error_message)
|
145
|
+
raise TypeError(error_message)
|
146
|
+
|
147
|
+
if documents and self.embedding is not None:
|
148
|
+
self.log(f"Adding {len(documents)} documents to the Vector Store.")
|
149
|
+
try:
|
150
|
+
vector_store.add_documents(documents)
|
151
|
+
except Exception as e:
|
152
|
+
error_message = f"Error adding documents to Vector Store: {e}"
|
153
|
+
self.log(error_message)
|
154
|
+
raise RuntimeError(error_message) from e
|
155
|
+
else:
|
156
|
+
self.log("No documents to add to the Vector Store.")
|
157
|
+
|
158
|
+
def search(self, query: str | None = None) -> list[dict[str, Any]]:
|
159
|
+
"""Search for similar documents in the vector store or retrieve all documents if no query is provided."""
|
160
|
+
try:
|
161
|
+
vector_store = self.build_vector_store()
|
162
|
+
|
163
|
+
query = query or ""
|
164
|
+
|
165
|
+
if self.hybrid_search_query.strip():
|
166
|
+
try:
|
167
|
+
hybrid_query = json.loads(self.hybrid_search_query)
|
168
|
+
except json.JSONDecodeError as e:
|
169
|
+
error_message = f"Invalid hybrid search query JSON: {e}"
|
170
|
+
self.log(error_message)
|
171
|
+
raise ValueError(error_message) from e
|
172
|
+
|
173
|
+
results = vector_store.client.search(index=self.index_name, body=hybrid_query)
|
174
|
+
|
175
|
+
processed_results = []
|
176
|
+
for hit in results.get("hits", {}).get("hits", []):
|
177
|
+
source = hit.get("_source", {})
|
178
|
+
text = source.get("text", "")
|
179
|
+
metadata = source.get("metadata", {})
|
180
|
+
|
181
|
+
if isinstance(text, dict):
|
182
|
+
text = text.get("text", "")
|
183
|
+
|
184
|
+
processed_results.append(
|
185
|
+
{
|
186
|
+
"page_content": text,
|
187
|
+
"metadata": metadata,
|
188
|
+
}
|
189
|
+
)
|
190
|
+
return processed_results
|
191
|
+
|
192
|
+
search_kwargs = {"k": self.number_of_results}
|
193
|
+
search_type = self.search_type.lower()
|
194
|
+
|
195
|
+
if search_type == "similarity":
|
196
|
+
results = vector_store.similarity_search(query, **search_kwargs)
|
197
|
+
return [{"page_content": doc.page_content, "metadata": doc.metadata} for doc in results]
|
198
|
+
if search_type == "similarity_score_threshold":
|
199
|
+
search_kwargs["score_threshold"] = self.search_score_threshold
|
200
|
+
results = vector_store.similarity_search_with_relevance_scores(query, **search_kwargs)
|
201
|
+
return [
|
202
|
+
{
|
203
|
+
"page_content": doc.page_content,
|
204
|
+
"metadata": doc.metadata,
|
205
|
+
"score": score,
|
206
|
+
}
|
207
|
+
for doc, score in results
|
208
|
+
]
|
209
|
+
if search_type == "mmr":
|
210
|
+
results = vector_store.max_marginal_relevance_search(query, **search_kwargs)
|
211
|
+
return [{"page_content": doc.page_content, "metadata": doc.metadata} for doc in results]
|
212
|
+
|
213
|
+
except Exception as e:
|
214
|
+
error_message = f"Error during search: {e}"
|
215
|
+
self.log(error_message)
|
216
|
+
raise RuntimeError(error_message) from e
|
217
|
+
|
218
|
+
error_message = f"Error during search. Invalid search type: {self.search_type}"
|
219
|
+
self.log(error_message)
|
220
|
+
raise ValueError(error_message)
|
221
|
+
|
222
|
+
def search_documents(self) -> list[Data]:
|
223
|
+
"""Search for documents in the vector store based on the search input.
|
224
|
+
|
225
|
+
If no search input is provided, retrieve all documents.
|
226
|
+
"""
|
227
|
+
try:
|
228
|
+
query = self.search_query.strip() if self.search_query else None
|
229
|
+
results = self.search(query)
|
230
|
+
retrieved_data = [
|
231
|
+
Data(
|
232
|
+
file_path=result["metadata"].get("file_path", ""),
|
233
|
+
text=result["page_content"],
|
234
|
+
)
|
235
|
+
for result in results
|
236
|
+
]
|
237
|
+
except Exception as e:
|
238
|
+
error_message = f"Error during document search: {e}"
|
239
|
+
self.log(error_message)
|
240
|
+
raise RuntimeError(error_message) from e
|
241
|
+
|
242
|
+
self.status = retrieved_data
|
243
|
+
return retrieved_data
|
@@ -0,0 +1,37 @@
|
|
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 lfx.components.embeddings.similarity import EmbeddingSimilarityComponent
|
9
|
+
from lfx.components.embeddings.text_embedder import TextEmbedderComponent
|
10
|
+
|
11
|
+
_dynamic_imports = {
|
12
|
+
"EmbeddingSimilarityComponent": "similarity",
|
13
|
+
"TextEmbedderComponent": "text_embedder",
|
14
|
+
}
|
15
|
+
|
16
|
+
__all__ = [
|
17
|
+
"EmbeddingSimilarityComponent",
|
18
|
+
"TextEmbedderComponent",
|
19
|
+
]
|
20
|
+
|
21
|
+
|
22
|
+
def __getattr__(attr_name: str) -> Any:
|
23
|
+
"""Lazily import embedding components on attribute access."""
|
24
|
+
if attr_name not in _dynamic_imports:
|
25
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
26
|
+
raise AttributeError(msg)
|
27
|
+
try:
|
28
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
29
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
30
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
31
|
+
raise AttributeError(msg) from e
|
32
|
+
globals()[attr_name] = result
|
33
|
+
return result
|
34
|
+
|
35
|
+
|
36
|
+
def __dir__() -> list[str]:
|
37
|
+
return list(__all__)
|
@@ -0,0 +1,76 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
import numpy as np
|
4
|
+
|
5
|
+
from lfx.custom.custom_component.component import Component
|
6
|
+
from lfx.io import DataInput, DropdownInput, Output
|
7
|
+
from lfx.schema.data import Data
|
8
|
+
|
9
|
+
|
10
|
+
class EmbeddingSimilarityComponent(Component):
|
11
|
+
display_name: str = "Embedding Similarity"
|
12
|
+
description: str = "Compute selected form of similarity between two embedding vectors."
|
13
|
+
icon = "equal"
|
14
|
+
legacy: bool = True
|
15
|
+
|
16
|
+
inputs = [
|
17
|
+
DataInput(
|
18
|
+
name="embedding_vectors",
|
19
|
+
display_name="Embedding Vectors",
|
20
|
+
info="A list containing exactly two data objects with embedding vectors to compare.",
|
21
|
+
is_list=True,
|
22
|
+
required=True,
|
23
|
+
),
|
24
|
+
DropdownInput(
|
25
|
+
name="similarity_metric",
|
26
|
+
display_name="Similarity Metric",
|
27
|
+
info="Select the similarity metric to use.",
|
28
|
+
options=["Cosine Similarity", "Euclidean Distance", "Manhattan Distance"],
|
29
|
+
value="Cosine Similarity",
|
30
|
+
),
|
31
|
+
]
|
32
|
+
|
33
|
+
outputs = [
|
34
|
+
Output(display_name="Similarity Data", name="similarity_data", method="compute_similarity"),
|
35
|
+
]
|
36
|
+
|
37
|
+
def compute_similarity(self) -> Data:
|
38
|
+
embedding_vectors: list[Data] = self.embedding_vectors
|
39
|
+
|
40
|
+
# Assert that the list contains exactly two Data objects
|
41
|
+
if len(embedding_vectors) != 2: # noqa: PLR2004
|
42
|
+
msg = "Exactly two embedding vectors are required."
|
43
|
+
raise ValueError(msg)
|
44
|
+
|
45
|
+
embedding_1 = np.array(embedding_vectors[0].data["embeddings"])
|
46
|
+
embedding_2 = np.array(embedding_vectors[1].data["embeddings"])
|
47
|
+
|
48
|
+
if embedding_1.shape != embedding_2.shape:
|
49
|
+
similarity_score: dict[str, Any] = {"error": "Embeddings must have the same dimensions."}
|
50
|
+
else:
|
51
|
+
similarity_metric = self.similarity_metric
|
52
|
+
|
53
|
+
if similarity_metric == "Cosine Similarity":
|
54
|
+
score = np.dot(embedding_1, embedding_2) / (np.linalg.norm(embedding_1) * np.linalg.norm(embedding_2))
|
55
|
+
similarity_score = {"cosine_similarity": score}
|
56
|
+
|
57
|
+
elif similarity_metric == "Euclidean Distance":
|
58
|
+
score = np.linalg.norm(embedding_1 - embedding_2)
|
59
|
+
similarity_score = {"euclidean_distance": score}
|
60
|
+
|
61
|
+
elif similarity_metric == "Manhattan Distance":
|
62
|
+
score = np.sum(np.abs(embedding_1 - embedding_2))
|
63
|
+
similarity_score = {"manhattan_distance": score}
|
64
|
+
|
65
|
+
# Create a Data object to encapsulate the similarity score and additional information
|
66
|
+
similarity_data = Data(
|
67
|
+
data={
|
68
|
+
"embedding_1": embedding_vectors[0].data["embeddings"],
|
69
|
+
"embedding_2": embedding_vectors[1].data["embeddings"],
|
70
|
+
"similarity_score": similarity_score,
|
71
|
+
},
|
72
|
+
text_key="similarity_score",
|
73
|
+
)
|
74
|
+
|
75
|
+
self.status = similarity_data
|
76
|
+
return similarity_data
|
@@ -0,0 +1,64 @@
|
|
1
|
+
from typing import TYPE_CHECKING
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.io import HandleInput, MessageInput, Output
|
5
|
+
from lfx.log.logger import logger
|
6
|
+
from lfx.schema.data import Data
|
7
|
+
|
8
|
+
if TYPE_CHECKING:
|
9
|
+
from lfx.field_typing import Embeddings
|
10
|
+
from lfx.schema.message import Message
|
11
|
+
|
12
|
+
|
13
|
+
class TextEmbedderComponent(Component):
|
14
|
+
display_name: str = "Text Embedder"
|
15
|
+
description: str = "Generate embeddings for a given message using the specified embedding model."
|
16
|
+
icon = "binary"
|
17
|
+
legacy: bool = True
|
18
|
+
inputs = [
|
19
|
+
HandleInput(
|
20
|
+
name="embedding_model",
|
21
|
+
display_name="Embedding Model",
|
22
|
+
info="The embedding model to use for generating embeddings.",
|
23
|
+
input_types=["Embeddings"],
|
24
|
+
required=True,
|
25
|
+
),
|
26
|
+
MessageInput(
|
27
|
+
name="message",
|
28
|
+
display_name="Message",
|
29
|
+
info="The message to generate embeddings for.",
|
30
|
+
required=True,
|
31
|
+
),
|
32
|
+
]
|
33
|
+
outputs = [
|
34
|
+
Output(display_name="Embedding Data", name="embeddings", method="generate_embeddings"),
|
35
|
+
]
|
36
|
+
|
37
|
+
def generate_embeddings(self) -> Data:
|
38
|
+
try:
|
39
|
+
embedding_model: Embeddings = self.embedding_model
|
40
|
+
message: Message = self.message
|
41
|
+
|
42
|
+
# Combine validation checks to reduce nesting
|
43
|
+
if not embedding_model or not hasattr(embedding_model, "embed_documents"):
|
44
|
+
msg = "Invalid or incompatible embedding model"
|
45
|
+
raise ValueError(msg)
|
46
|
+
|
47
|
+
text_content = message.text if message and message.text else ""
|
48
|
+
if not text_content:
|
49
|
+
msg = "No text content found in message"
|
50
|
+
raise ValueError(msg)
|
51
|
+
|
52
|
+
embeddings = embedding_model.embed_documents([text_content])
|
53
|
+
if not embeddings or not isinstance(embeddings, list):
|
54
|
+
msg = "Invalid embeddings generated"
|
55
|
+
raise ValueError(msg)
|
56
|
+
|
57
|
+
embedding_vector = embeddings[0]
|
58
|
+
self.status = {"text": text_content, "embeddings": embedding_vector}
|
59
|
+
return Data(data={"text": text_content, "embeddings": embedding_vector})
|
60
|
+
except Exception as e: # noqa: BLE001
|
61
|
+
logger.exception("Error generating embeddings")
|
62
|
+
error_data = Data(data={"text": "", "embeddings": [], "error": str(e)})
|
63
|
+
self.status = {"error": str(e)}
|
64
|
+
return error_data
|
@@ -0,0 +1,68 @@
|
|
1
|
+
from langchain_core.tools import tool
|
2
|
+
from metaphor_python import Metaphor
|
3
|
+
|
4
|
+
from lfx.custom.custom_component.component import Component
|
5
|
+
from lfx.field_typing import Tool
|
6
|
+
from lfx.io import BoolInput, IntInput, Output, SecretStrInput
|
7
|
+
|
8
|
+
|
9
|
+
class ExaSearchToolkit(Component):
|
10
|
+
display_name = "Exa Search"
|
11
|
+
description = "Exa Search toolkit for search and content retrieval"
|
12
|
+
documentation = "https://python.langchain.com/docs/integrations/tools/metaphor_search"
|
13
|
+
beta = True
|
14
|
+
name = "ExaSearch"
|
15
|
+
icon = "ExaSearch"
|
16
|
+
|
17
|
+
inputs = [
|
18
|
+
SecretStrInput(
|
19
|
+
name="metaphor_api_key",
|
20
|
+
display_name="Exa Search API Key",
|
21
|
+
password=True,
|
22
|
+
),
|
23
|
+
BoolInput(
|
24
|
+
name="use_autoprompt",
|
25
|
+
display_name="Use Autoprompt",
|
26
|
+
value=True,
|
27
|
+
),
|
28
|
+
IntInput(
|
29
|
+
name="search_num_results",
|
30
|
+
display_name="Search Number of Results",
|
31
|
+
value=5,
|
32
|
+
),
|
33
|
+
IntInput(
|
34
|
+
name="similar_num_results",
|
35
|
+
display_name="Similar Number of Results",
|
36
|
+
value=5,
|
37
|
+
),
|
38
|
+
]
|
39
|
+
|
40
|
+
outputs = [
|
41
|
+
Output(name="tools", display_name="Tools", method="build_toolkit"),
|
42
|
+
]
|
43
|
+
|
44
|
+
def build_toolkit(self) -> Tool:
|
45
|
+
client = Metaphor(api_key=self.metaphor_api_key)
|
46
|
+
|
47
|
+
@tool
|
48
|
+
def search(query: str):
|
49
|
+
"""Call search engine with a query."""
|
50
|
+
return client.search(query, use_autoprompt=self.use_autoprompt, num_results=self.search_num_results)
|
51
|
+
|
52
|
+
@tool
|
53
|
+
def get_contents(ids: list[str]):
|
54
|
+
"""Get contents of a webpage.
|
55
|
+
|
56
|
+
The ids passed in should be a list of ids as fetched from `search`.
|
57
|
+
"""
|
58
|
+
return client.get_contents(ids)
|
59
|
+
|
60
|
+
@tool
|
61
|
+
def find_similar(url: str):
|
62
|
+
"""Get search results similar to a given URL.
|
63
|
+
|
64
|
+
The url passed in should be a URL returned from `search`
|
65
|
+
"""
|
66
|
+
return client.find_similar(url, num_results=self.similar_num_results)
|
67
|
+
|
68
|
+
return [search, get_contents, find_similar]
|
@@ -0,0 +1,43 @@
|
|
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 .firecrawl_crawl_api import FirecrawlCrawlApi
|
9
|
+
from .firecrawl_extract_api import FirecrawlExtractApi
|
10
|
+
from .firecrawl_map_api import FirecrawlMapApi
|
11
|
+
from .firecrawl_scrape_api import FirecrawlScrapeApi
|
12
|
+
|
13
|
+
_dynamic_imports = {
|
14
|
+
"FirecrawlCrawlApi": "firecrawl_crawl_api",
|
15
|
+
"FirecrawlExtractApi": "firecrawl_extract_api",
|
16
|
+
"FirecrawlMapApi": "firecrawl_map_api",
|
17
|
+
"FirecrawlScrapeApi": "firecrawl_scrape_api",
|
18
|
+
}
|
19
|
+
|
20
|
+
__all__ = [
|
21
|
+
"FirecrawlCrawlApi",
|
22
|
+
"FirecrawlExtractApi",
|
23
|
+
"FirecrawlMapApi",
|
24
|
+
"FirecrawlScrapeApi",
|
25
|
+
]
|
26
|
+
|
27
|
+
|
28
|
+
def __getattr__(attr_name: str) -> Any:
|
29
|
+
"""Lazily import firecrawl components on attribute access."""
|
30
|
+
if attr_name not in _dynamic_imports:
|
31
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
32
|
+
raise AttributeError(msg)
|
33
|
+
try:
|
34
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
35
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
36
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
37
|
+
raise AttributeError(msg) from e
|
38
|
+
globals()[attr_name] = result
|
39
|
+
return result
|
40
|
+
|
41
|
+
|
42
|
+
def __dir__() -> list[str]:
|
43
|
+
return list(__all__)
|
@@ -0,0 +1,88 @@
|
|
1
|
+
import uuid
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.io import DataInput, IntInput, MultilineInput, Output, SecretStrInput, StrInput
|
5
|
+
from lfx.schema.data import Data
|
6
|
+
|
7
|
+
|
8
|
+
class FirecrawlCrawlApi(Component):
|
9
|
+
display_name: str = "Firecrawl Crawl API"
|
10
|
+
description: str = "Crawls a URL and returns the results."
|
11
|
+
name = "FirecrawlCrawlApi"
|
12
|
+
|
13
|
+
documentation: str = "https://docs.firecrawl.dev/v1/api-reference/endpoint/crawl-post"
|
14
|
+
|
15
|
+
inputs = [
|
16
|
+
SecretStrInput(
|
17
|
+
name="api_key",
|
18
|
+
display_name="API Key",
|
19
|
+
required=True,
|
20
|
+
password=True,
|
21
|
+
info="The API key to use Firecrawl API.",
|
22
|
+
),
|
23
|
+
MultilineInput(
|
24
|
+
name="url",
|
25
|
+
display_name="URL",
|
26
|
+
required=True,
|
27
|
+
info="The URL to scrape.",
|
28
|
+
tool_mode=True,
|
29
|
+
),
|
30
|
+
IntInput(
|
31
|
+
name="timeout",
|
32
|
+
display_name="Timeout",
|
33
|
+
info="Timeout in milliseconds for the request.",
|
34
|
+
),
|
35
|
+
StrInput(
|
36
|
+
name="idempotency_key",
|
37
|
+
display_name="Idempotency Key",
|
38
|
+
info="Optional idempotency key to ensure unique requests.",
|
39
|
+
),
|
40
|
+
DataInput(
|
41
|
+
name="crawlerOptions",
|
42
|
+
display_name="Crawler Options",
|
43
|
+
info="The crawler options to send with the request.",
|
44
|
+
),
|
45
|
+
DataInput(
|
46
|
+
name="scrapeOptions",
|
47
|
+
display_name="Scrape Options",
|
48
|
+
info="The page options to send with the request.",
|
49
|
+
),
|
50
|
+
]
|
51
|
+
|
52
|
+
outputs = [
|
53
|
+
Output(display_name="Data", name="data", method="crawl"),
|
54
|
+
]
|
55
|
+
idempotency_key: str | None = None
|
56
|
+
|
57
|
+
def crawl(self) -> Data:
|
58
|
+
try:
|
59
|
+
from firecrawl import FirecrawlApp
|
60
|
+
except ImportError as e:
|
61
|
+
msg = "Could not import firecrawl integration package. Please install it with `pip install firecrawl-py`."
|
62
|
+
raise ImportError(msg) from e
|
63
|
+
|
64
|
+
params = self.crawlerOptions.__dict__["data"] if self.crawlerOptions else {}
|
65
|
+
scrape_options_dict = self.scrapeOptions.__dict__["data"] if self.scrapeOptions else {}
|
66
|
+
if scrape_options_dict:
|
67
|
+
params["scrapeOptions"] = scrape_options_dict
|
68
|
+
|
69
|
+
# Set default values for new parameters in v1
|
70
|
+
params.setdefault("maxDepth", 2)
|
71
|
+
params.setdefault("limit", 10000)
|
72
|
+
params.setdefault("allowExternalLinks", False)
|
73
|
+
params.setdefault("allowBackwardLinks", False)
|
74
|
+
params.setdefault("ignoreSitemap", False)
|
75
|
+
params.setdefault("ignoreQueryParameters", False)
|
76
|
+
|
77
|
+
# Ensure onlyMainContent is explicitly set if not provided
|
78
|
+
if "scrapeOptions" in params:
|
79
|
+
params["scrapeOptions"].setdefault("onlyMainContent", True)
|
80
|
+
else:
|
81
|
+
params["scrapeOptions"] = {"onlyMainContent": True}
|
82
|
+
|
83
|
+
if not self.idempotency_key:
|
84
|
+
self.idempotency_key = str(uuid.uuid4())
|
85
|
+
|
86
|
+
app = FirecrawlApp(api_key=self.api_key)
|
87
|
+
crawl_result = app.crawl_url(self.url, params=params, idempotency_key=self.idempotency_key)
|
88
|
+
return Data(data={"results": crawl_result})
|