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,22 @@
|
|
1
|
+
from langchain_core.documents import Document
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
4
|
+
from lfx.schema.data import Data
|
5
|
+
|
6
|
+
|
7
|
+
class DocumentsToDataComponent(CustomComponent):
|
8
|
+
display_name = "Documents ⇢ Data"
|
9
|
+
description = "Convert LangChain Documents into Data."
|
10
|
+
icon = "LangChain"
|
11
|
+
name = "DocumentsToData"
|
12
|
+
|
13
|
+
field_config = {
|
14
|
+
"documents": {"display_name": "Documents"},
|
15
|
+
}
|
16
|
+
|
17
|
+
def build(self, documents: list[Document]) -> list[Data]:
|
18
|
+
if isinstance(documents, Document):
|
19
|
+
documents = [documents]
|
20
|
+
data = [Data.from_document(document) for document in documents]
|
21
|
+
self.status = data
|
22
|
+
return data
|
@@ -0,0 +1,16 @@
|
|
1
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
2
|
+
from lfx.field_typing import Embeddings
|
3
|
+
from lfx.schema.data import Data
|
4
|
+
|
5
|
+
|
6
|
+
class EmbedComponent(CustomComponent):
|
7
|
+
display_name = "Embed Texts"
|
8
|
+
name = "Embed"
|
9
|
+
|
10
|
+
def build_config(self):
|
11
|
+
return {"texts": {"display_name": "Texts"}, "embbedings": {"display_name": "Embeddings"}}
|
12
|
+
|
13
|
+
def build(self, texts: list[str], embbedings: Embeddings) -> Data:
|
14
|
+
vectors = Data(vector=embbedings.embed_documents(texts))
|
15
|
+
self.status = vectors
|
16
|
+
return vectors
|
@@ -0,0 +1,46 @@
|
|
1
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
2
|
+
from lfx.schema.data import Data
|
3
|
+
|
4
|
+
|
5
|
+
class ExtractKeyFromDataComponent(CustomComponent):
|
6
|
+
display_name = "Extract Key From Data"
|
7
|
+
description = "Extracts a key from a data."
|
8
|
+
beta: bool = True
|
9
|
+
name = "ExtractKeyFromData"
|
10
|
+
|
11
|
+
field_config = {
|
12
|
+
"data": {"display_name": "Data"},
|
13
|
+
"keys": {
|
14
|
+
"display_name": "Keys",
|
15
|
+
"info": "The keys to extract from the data.",
|
16
|
+
"input_types": [],
|
17
|
+
},
|
18
|
+
"silent_error": {
|
19
|
+
"display_name": "Silent Errors",
|
20
|
+
"info": "If True, errors will not be raised.",
|
21
|
+
"advanced": True,
|
22
|
+
},
|
23
|
+
}
|
24
|
+
|
25
|
+
def build(self, data: Data, keys: list[str], *, silent_error: bool = True) -> Data:
|
26
|
+
"""Extracts the keys from a data.
|
27
|
+
|
28
|
+
Args:
|
29
|
+
data (Data): The data from which to extract the keys.
|
30
|
+
keys (list[str]): The keys to extract from the data.
|
31
|
+
silent_error (bool): If True, errors will not be raised.
|
32
|
+
|
33
|
+
Returns:
|
34
|
+
dict: The extracted keys.
|
35
|
+
"""
|
36
|
+
extracted_keys = {}
|
37
|
+
for key in keys:
|
38
|
+
try:
|
39
|
+
extracted_keys[key] = getattr(data, key)
|
40
|
+
except AttributeError as e:
|
41
|
+
if not silent_error:
|
42
|
+
msg = f"The key '{key}' does not exist in the data."
|
43
|
+
raise KeyError(msg) from e
|
44
|
+
return_data = Data(data=extracted_keys)
|
45
|
+
self.status = return_data
|
46
|
+
return return_data
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# JSON Document Builder
|
2
|
+
|
3
|
+
# Build a Document containing a JSON object using a key and another Document page content.
|
4
|
+
|
5
|
+
# **Params**
|
6
|
+
|
7
|
+
# - **Key:** The key to use for the JSON object.
|
8
|
+
# - **Document:** The Document page to use for the JSON object.
|
9
|
+
|
10
|
+
# **Output**
|
11
|
+
|
12
|
+
# - **Document:** The Document containing the JSON object.
|
13
|
+
|
14
|
+
|
15
|
+
import orjson
|
16
|
+
from langchain_core.documents import Document
|
17
|
+
|
18
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
19
|
+
from lfx.io import HandleInput, StrInput
|
20
|
+
|
21
|
+
|
22
|
+
class JSONDocumentBuilder(CustomComponent):
|
23
|
+
display_name: str = "JSON Document Builder"
|
24
|
+
description: str = "Build a Document containing a JSON object using a key and another Document page content."
|
25
|
+
name = "JSONDocumentBuilder"
|
26
|
+
documentation: str = "https://docs.langflow.org/components/utilities#json-document-builder"
|
27
|
+
legacy = True
|
28
|
+
|
29
|
+
inputs = [
|
30
|
+
StrInput(
|
31
|
+
name="key",
|
32
|
+
display_name="Key",
|
33
|
+
required=True,
|
34
|
+
),
|
35
|
+
HandleInput(
|
36
|
+
name="document",
|
37
|
+
display_name="Document",
|
38
|
+
required=True,
|
39
|
+
),
|
40
|
+
]
|
41
|
+
|
42
|
+
def build(
|
43
|
+
self,
|
44
|
+
key: str,
|
45
|
+
document: Document,
|
46
|
+
) -> Document:
|
47
|
+
documents = None
|
48
|
+
if isinstance(document, list):
|
49
|
+
documents = [Document(page_content=orjson.dumps({key: doc.page_content}).decode()) for doc in document]
|
50
|
+
elif isinstance(document, Document):
|
51
|
+
documents = Document(page_content=orjson.dumps({key: document.page_content}).decode())
|
52
|
+
else:
|
53
|
+
msg = f"Expected Document or list of Documents, got {type(document)}"
|
54
|
+
raise TypeError(msg)
|
55
|
+
|
56
|
+
self.repr_value = documents
|
57
|
+
return documents
|
@@ -0,0 +1,20 @@
|
|
1
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
2
|
+
from lfx.schema.data import Data
|
3
|
+
|
4
|
+
|
5
|
+
class ListFlowsComponent(CustomComponent):
|
6
|
+
display_name = "List Flows"
|
7
|
+
description = "A component to list all available flows."
|
8
|
+
icon = "ListFlows"
|
9
|
+
beta: bool = True
|
10
|
+
name = "ListFlows"
|
11
|
+
|
12
|
+
def build_config(self):
|
13
|
+
return {}
|
14
|
+
|
15
|
+
async def build(
|
16
|
+
self,
|
17
|
+
) -> list[Data]:
|
18
|
+
flows = await self.alist_flows()
|
19
|
+
self.status = flows
|
20
|
+
return flows
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# from lfx.field_typing import Data
|
2
|
+
|
3
|
+
from langchain_core.tools import StructuredTool
|
4
|
+
from mcp import types
|
5
|
+
|
6
|
+
from lfx.base.mcp.util import (
|
7
|
+
MCPSseClient,
|
8
|
+
create_input_schema_from_json_schema,
|
9
|
+
create_tool_coroutine,
|
10
|
+
create_tool_func,
|
11
|
+
)
|
12
|
+
from lfx.custom.custom_component.component import Component
|
13
|
+
from lfx.field_typing import Tool
|
14
|
+
from lfx.io import MessageTextInput, Output
|
15
|
+
|
16
|
+
|
17
|
+
class MCPSse(Component):
|
18
|
+
client = MCPSseClient()
|
19
|
+
tools = types.ListToolsResult
|
20
|
+
tool_names = [str]
|
21
|
+
display_name = "MCP Tools (SSE) [DEPRECATED]"
|
22
|
+
description = "Connects to an MCP server over SSE and exposes it's tools as langflow tools to be used by an Agent."
|
23
|
+
documentation: str = "https://docs.langflow.org/components-custom-components"
|
24
|
+
icon = "code"
|
25
|
+
name = "MCPSse"
|
26
|
+
legacy = True
|
27
|
+
|
28
|
+
inputs = [
|
29
|
+
MessageTextInput(
|
30
|
+
name="url",
|
31
|
+
display_name="mcp sse url",
|
32
|
+
info="sse url",
|
33
|
+
value="http://localhost:7860/api/v1/mcp/sse",
|
34
|
+
tool_mode=True,
|
35
|
+
),
|
36
|
+
]
|
37
|
+
|
38
|
+
outputs = [
|
39
|
+
Output(display_name="Tools", name="tools", method="build_output"),
|
40
|
+
]
|
41
|
+
|
42
|
+
async def build_output(self) -> list[Tool]:
|
43
|
+
if self.client.session is None:
|
44
|
+
self.tools = await self.client.connect_to_server(self.url, {})
|
45
|
+
|
46
|
+
tool_list = []
|
47
|
+
|
48
|
+
for tool in self.tools:
|
49
|
+
args_schema = create_input_schema_from_json_schema(tool.inputSchema)
|
50
|
+
tool_list.append(
|
51
|
+
StructuredTool(
|
52
|
+
name=tool.name, # maybe format this
|
53
|
+
description=tool.description,
|
54
|
+
args_schema=args_schema,
|
55
|
+
func=create_tool_func(tool.name, args_schema, self.client.session),
|
56
|
+
coroutine=create_tool_coroutine(tool.name, args_schema, self.client.session),
|
57
|
+
)
|
58
|
+
)
|
59
|
+
|
60
|
+
self.tool_names = [tool.name for tool in self.tools]
|
61
|
+
return tool_list
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# from lfx.field_typing import Data
|
2
|
+
|
3
|
+
from langchain_core.tools import StructuredTool
|
4
|
+
from mcp import types
|
5
|
+
|
6
|
+
from lfx.base.mcp.util import (
|
7
|
+
MCPStdioClient,
|
8
|
+
create_input_schema_from_json_schema,
|
9
|
+
create_tool_coroutine,
|
10
|
+
create_tool_func,
|
11
|
+
)
|
12
|
+
from lfx.custom.custom_component.component import Component
|
13
|
+
from lfx.field_typing import Tool
|
14
|
+
from lfx.io import MessageTextInput, Output
|
15
|
+
|
16
|
+
|
17
|
+
class MCPStdio(Component):
|
18
|
+
client = MCPStdioClient()
|
19
|
+
tools = types.ListToolsResult
|
20
|
+
tool_names = [str]
|
21
|
+
display_name = "MCP Tools (stdio) [DEPRECATED]"
|
22
|
+
description = (
|
23
|
+
"Connects to an MCP server over stdio and exposes it's tools as langflow tools to be used by an Agent."
|
24
|
+
)
|
25
|
+
documentation: str = "https://docs.langflow.org/components-custom-components"
|
26
|
+
icon = "code"
|
27
|
+
name = "MCPStdio"
|
28
|
+
legacy = True
|
29
|
+
|
30
|
+
inputs = [
|
31
|
+
MessageTextInput(
|
32
|
+
name="command",
|
33
|
+
display_name="mcp command",
|
34
|
+
info="mcp command",
|
35
|
+
value="uvx mcp-sse-shim@latest",
|
36
|
+
tool_mode=True,
|
37
|
+
),
|
38
|
+
]
|
39
|
+
|
40
|
+
outputs = [
|
41
|
+
Output(display_name="Tools", name="tools", method="build_output"),
|
42
|
+
]
|
43
|
+
|
44
|
+
async def build_output(self) -> list[Tool]:
|
45
|
+
if self.client.session is None:
|
46
|
+
self.tools = await self.client.connect_to_server(self.command)
|
47
|
+
|
48
|
+
tool_list = []
|
49
|
+
|
50
|
+
for tool in self.tools:
|
51
|
+
args_schema = create_input_schema_from_json_schema(tool.inputSchema)
|
52
|
+
tool_list.append(
|
53
|
+
StructuredTool(
|
54
|
+
name=tool.name,
|
55
|
+
description=tool.description,
|
56
|
+
args_schema=args_schema,
|
57
|
+
func=create_tool_func(tool.name, args_schema, self.client.session),
|
58
|
+
coroutine=create_tool_coroutine(tool.name, args_schema, self.client.session),
|
59
|
+
)
|
60
|
+
)
|
61
|
+
self.tool_names = [tool.name for tool in self.tools]
|
62
|
+
return tool_list
|
@@ -0,0 +1,93 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.io import DataInput, Output
|
3
|
+
from lfx.log.logger import logger
|
4
|
+
from lfx.schema.data import Data
|
5
|
+
|
6
|
+
|
7
|
+
class MergeDataComponent(Component):
|
8
|
+
"""MergeDataComponent is responsible for combining multiple Data objects into a unified list of Data objects.
|
9
|
+
|
10
|
+
It ensures that all keys across the input Data objects are present in each merged Data object.
|
11
|
+
Missing keys are filled with empty strings to maintain consistency.
|
12
|
+
"""
|
13
|
+
|
14
|
+
display_name = "Merge Data"
|
15
|
+
description = (
|
16
|
+
"Combines multiple Data objects into a unified list, ensuring all keys are present in each Data object."
|
17
|
+
)
|
18
|
+
icon = "merge"
|
19
|
+
|
20
|
+
inputs = [
|
21
|
+
DataInput(
|
22
|
+
name="data_inputs",
|
23
|
+
display_name="Data Inputs",
|
24
|
+
is_list=True,
|
25
|
+
info="A list of Data inputs objects to be merged.",
|
26
|
+
),
|
27
|
+
]
|
28
|
+
|
29
|
+
outputs = [
|
30
|
+
Output(
|
31
|
+
display_name="Merged Data",
|
32
|
+
name="merged_data",
|
33
|
+
method="merge_data",
|
34
|
+
),
|
35
|
+
]
|
36
|
+
|
37
|
+
def merge_data(self) -> list[Data]:
|
38
|
+
"""Merges multiple Data objects into a single list of Data objects.
|
39
|
+
|
40
|
+
Ensures that all keys from the input Data objects are present in each merged Data object.
|
41
|
+
Missing keys are filled with empty strings.
|
42
|
+
|
43
|
+
Returns:
|
44
|
+
List[Data]: A list of merged Data objects with consistent keys.
|
45
|
+
"""
|
46
|
+
logger.info("Initiating the data merging process.")
|
47
|
+
|
48
|
+
data_inputs: list[Data] = self.data_inputs
|
49
|
+
logger.debug(f"Received {len(data_inputs)} data input(s) for merging.")
|
50
|
+
|
51
|
+
if not data_inputs:
|
52
|
+
logger.warning("No data inputs provided. Returning an empty list.")
|
53
|
+
return []
|
54
|
+
|
55
|
+
# Collect all unique keys from all Data objects
|
56
|
+
all_keys: set[str] = set()
|
57
|
+
for idx, data_input in enumerate(data_inputs):
|
58
|
+
if not isinstance(data_input, Data):
|
59
|
+
error_message = f"Data input at index {idx} is not of type Data."
|
60
|
+
logger.error(error_message)
|
61
|
+
type_error_message = (
|
62
|
+
f"All items in data_inputs must be of type Data. Item at index {idx} is {type(data_input)}"
|
63
|
+
)
|
64
|
+
raise TypeError(type_error_message)
|
65
|
+
all_keys.update(data_input.data.keys())
|
66
|
+
logger.debug(f"Collected {len(all_keys)} unique key(s) from input data.")
|
67
|
+
|
68
|
+
try:
|
69
|
+
# Create new list of Data objects with missing keys filled with empty strings
|
70
|
+
merged_data_list = []
|
71
|
+
for idx, data_input in enumerate(data_inputs):
|
72
|
+
merged_data_dict = {}
|
73
|
+
|
74
|
+
for key in all_keys:
|
75
|
+
# Use the existing value if the key exists, otherwise use an empty string
|
76
|
+
value = data_input.data.get(key, "")
|
77
|
+
if key not in data_input.data:
|
78
|
+
log_message = f"Key '{key}' missing in data input at index {idx}. Assigning empty string."
|
79
|
+
logger.debug(log_message)
|
80
|
+
merged_data_dict[key] = value
|
81
|
+
|
82
|
+
merged_data = Data(
|
83
|
+
text_key=data_input.text_key, data=merged_data_dict, default_value=data_input.default_value
|
84
|
+
)
|
85
|
+
merged_data_list.append(merged_data)
|
86
|
+
logger.debug(f"Merged Data object created for input at index {idx}.")
|
87
|
+
|
88
|
+
except Exception:
|
89
|
+
logger.exception("An error occurred during the data merging process.")
|
90
|
+
raise
|
91
|
+
|
92
|
+
logger.info("Data merging process completed successfully.")
|
93
|
+
return merged_data_list
|
@@ -0,0 +1,37 @@
|
|
1
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
2
|
+
from lfx.schema.message import Message
|
3
|
+
from lfx.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_USER
|
4
|
+
|
5
|
+
|
6
|
+
class MessageComponent(CustomComponent):
|
7
|
+
display_name = "Message"
|
8
|
+
description = "Creates a Message object given a Session ID."
|
9
|
+
name = "Message"
|
10
|
+
|
11
|
+
def build_config(self):
|
12
|
+
return {
|
13
|
+
"sender": {
|
14
|
+
"options": [MESSAGE_SENDER_AI, MESSAGE_SENDER_USER],
|
15
|
+
"display_name": "Sender Type",
|
16
|
+
},
|
17
|
+
"sender_name": {"display_name": "Sender Name"},
|
18
|
+
"text": {"display_name": "Text"},
|
19
|
+
"session_id": {
|
20
|
+
"display_name": "Session ID",
|
21
|
+
"info": "Session ID of the chat history.",
|
22
|
+
"input_types": ["Message"],
|
23
|
+
},
|
24
|
+
}
|
25
|
+
|
26
|
+
def build(
|
27
|
+
self,
|
28
|
+
sender: str = MESSAGE_SENDER_USER,
|
29
|
+
sender_name: str | None = None,
|
30
|
+
session_id: str | None = None,
|
31
|
+
text: str = "",
|
32
|
+
) -> Message:
|
33
|
+
flow_id = self.graph.flow_id if hasattr(self, "graph") else None
|
34
|
+
message = Message(text=text, sender=sender, sender_name=sender_name, flow_id=flow_id, session_id=session_id)
|
35
|
+
|
36
|
+
self.status = message
|
37
|
+
return message
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# mypy: disable-error-code="attr-defined"
|
2
|
+
from langchain_community.retrievers import MetalRetriever
|
3
|
+
|
4
|
+
from lfx.base.vectorstores.model import check_cached_vector_store
|
5
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
6
|
+
from lfx.io import DictInput, SecretStrInput, StrInput
|
7
|
+
|
8
|
+
|
9
|
+
class MetalRetrieverComponent(CustomComponent):
|
10
|
+
display_name: str = "Metal Retriever"
|
11
|
+
description: str = "Retriever that uses the Metal API."
|
12
|
+
name = "MetalRetriever"
|
13
|
+
legacy = True
|
14
|
+
|
15
|
+
inputs = [
|
16
|
+
SecretStrInput(
|
17
|
+
name="api_key",
|
18
|
+
display_name="API Key",
|
19
|
+
required=True,
|
20
|
+
),
|
21
|
+
SecretStrInput(
|
22
|
+
name="client_id",
|
23
|
+
display_name="Client ID",
|
24
|
+
required=True,
|
25
|
+
),
|
26
|
+
StrInput(
|
27
|
+
name="index_id",
|
28
|
+
display_name="Index ID",
|
29
|
+
required=True,
|
30
|
+
),
|
31
|
+
DictInput(
|
32
|
+
name="params",
|
33
|
+
display_name="Parameters",
|
34
|
+
required=False,
|
35
|
+
),
|
36
|
+
]
|
37
|
+
|
38
|
+
@check_cached_vector_store
|
39
|
+
def build_vector_store(self) -> MetalRetriever:
|
40
|
+
"""Builds the Metal Retriever."""
|
41
|
+
try:
|
42
|
+
from langchain_community.retrievers import MetalRetriever
|
43
|
+
from metal_sdk.metal import Metal
|
44
|
+
except ImportError as e:
|
45
|
+
msg = "Could not import Metal. Please install it with `pip install metal-sdk langchain-community`."
|
46
|
+
raise ImportError(msg) from e
|
47
|
+
|
48
|
+
try:
|
49
|
+
metal = Metal(api_key=self.api_key, client_id=self.client_id, index_id=self.index_id)
|
50
|
+
except Exception as e:
|
51
|
+
msg = "Could not connect to Metal API."
|
52
|
+
raise ValueError(msg) from e
|
53
|
+
|
54
|
+
return MetalRetriever(client=metal, params=self.params or {})
|
@@ -0,0 +1,59 @@
|
|
1
|
+
from langchain.prompts import PromptTemplate
|
2
|
+
from langchain.retrievers import MultiQueryRetriever
|
3
|
+
|
4
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
5
|
+
from lfx.field_typing import BaseRetriever, LanguageModel, Text
|
6
|
+
from lfx.inputs.inputs import HandleInput, StrInput
|
7
|
+
|
8
|
+
|
9
|
+
class MultiQueryRetrieverComponent(CustomComponent):
|
10
|
+
display_name = "MultiQueryRetriever"
|
11
|
+
description = "Initialize from llm using default template."
|
12
|
+
documentation = "https://python.langchain.com/docs/modules/data_connection/retrievers/how_to/MultiQueryRetriever"
|
13
|
+
name = "MultiQueryRetriever"
|
14
|
+
legacy = True
|
15
|
+
|
16
|
+
inputs = [
|
17
|
+
HandleInput(
|
18
|
+
name="llm",
|
19
|
+
display_name="LLM",
|
20
|
+
input_types=["LanguageModel"],
|
21
|
+
required=True,
|
22
|
+
),
|
23
|
+
HandleInput(
|
24
|
+
name="retriever",
|
25
|
+
display_name="Retriever",
|
26
|
+
input_types=["BaseRetriever"],
|
27
|
+
required=True,
|
28
|
+
),
|
29
|
+
StrInput(
|
30
|
+
name="prompt",
|
31
|
+
display_name="Prompt",
|
32
|
+
value="You are an AI language model assistant. Your task is \n"
|
33
|
+
"to generate 3 different versions of the given user \n"
|
34
|
+
"question to retrieve relevant documents from a vector database. \n"
|
35
|
+
"By generating multiple perspectives on the user question, \n"
|
36
|
+
"your goal is to help the user overcome some of the limitations \n"
|
37
|
+
"of distance-based similarity search. Provide these alternative \n"
|
38
|
+
"questions separated by newlines. Original question: {question}",
|
39
|
+
required=False,
|
40
|
+
),
|
41
|
+
StrInput(
|
42
|
+
name="parser_key",
|
43
|
+
display_name="Parser Key",
|
44
|
+
value="lines",
|
45
|
+
required=False,
|
46
|
+
),
|
47
|
+
]
|
48
|
+
|
49
|
+
def build(
|
50
|
+
self,
|
51
|
+
llm: LanguageModel,
|
52
|
+
retriever: BaseRetriever,
|
53
|
+
prompt: Text | None = None,
|
54
|
+
parser_key: str = "lines",
|
55
|
+
) -> MultiQueryRetriever:
|
56
|
+
if not prompt:
|
57
|
+
return MultiQueryRetriever.from_llm(llm=llm, retriever=retriever, parser_key=parser_key)
|
58
|
+
prompt_template = PromptTemplate.from_template(prompt)
|
59
|
+
return MultiQueryRetriever.from_llm(llm=llm, retriever=retriever, prompt=prompt_template, parser_key=parser_key)
|
@@ -0,0 +1,43 @@
|
|
1
|
+
from langchain_core.tools import create_retriever_tool
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
4
|
+
from lfx.field_typing import BaseRetriever, Tool
|
5
|
+
from lfx.io import HandleInput, StrInput
|
6
|
+
|
7
|
+
|
8
|
+
class RetrieverToolComponent(CustomComponent):
|
9
|
+
display_name = "RetrieverTool"
|
10
|
+
description = "Tool for interacting with retriever"
|
11
|
+
name = "RetrieverTool"
|
12
|
+
icon = "LangChain"
|
13
|
+
legacy = True
|
14
|
+
|
15
|
+
inputs = [
|
16
|
+
HandleInput(
|
17
|
+
name="retriever",
|
18
|
+
display_name="Retriever",
|
19
|
+
info="Retriever to interact with",
|
20
|
+
input_types=["Retriever"],
|
21
|
+
required=True,
|
22
|
+
),
|
23
|
+
StrInput(
|
24
|
+
name="name",
|
25
|
+
display_name="Name",
|
26
|
+
info="Name of the tool",
|
27
|
+
required=True,
|
28
|
+
),
|
29
|
+
StrInput(
|
30
|
+
name="description",
|
31
|
+
display_name="Description",
|
32
|
+
info="Description of the tool",
|
33
|
+
required=True,
|
34
|
+
),
|
35
|
+
]
|
36
|
+
|
37
|
+
def build(self, retriever: BaseRetriever, name: str, description: str, **kwargs) -> Tool:
|
38
|
+
_ = kwargs
|
39
|
+
return create_retriever_tool(
|
40
|
+
retriever=retriever,
|
41
|
+
name=name,
|
42
|
+
description=description,
|
43
|
+
)
|
@@ -0,0 +1,77 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.field_typing import Text
|
3
|
+
from lfx.io import BoolInput, DropdownInput, MessageTextInput, Output
|
4
|
+
|
5
|
+
|
6
|
+
class SelectivePassThroughComponent(Component):
|
7
|
+
display_name = "Selective Pass Through"
|
8
|
+
description = "Passes the specified value if a specified condition is met."
|
9
|
+
icon = "filter"
|
10
|
+
name = "SelectivePassThrough"
|
11
|
+
|
12
|
+
inputs = [
|
13
|
+
MessageTextInput(
|
14
|
+
name="input_value",
|
15
|
+
display_name="Input Value",
|
16
|
+
info="The primary input value to evaluate.",
|
17
|
+
),
|
18
|
+
MessageTextInput(
|
19
|
+
name="comparison_value",
|
20
|
+
display_name="Comparison Value",
|
21
|
+
info="The value to compare against the input value.",
|
22
|
+
),
|
23
|
+
DropdownInput(
|
24
|
+
name="operator",
|
25
|
+
display_name="Operator",
|
26
|
+
options=["equals", "not equals", "contains", "starts with", "ends with"],
|
27
|
+
info="Condition to evaluate the input value.",
|
28
|
+
),
|
29
|
+
MessageTextInput(
|
30
|
+
name="value_to_pass",
|
31
|
+
display_name="Value to Pass",
|
32
|
+
info="The value to pass if the condition is met.",
|
33
|
+
),
|
34
|
+
BoolInput(
|
35
|
+
name="case_sensitive",
|
36
|
+
display_name="Case Sensitive",
|
37
|
+
info="If true, the comparison will be case sensitive.",
|
38
|
+
value=False,
|
39
|
+
advanced=True,
|
40
|
+
),
|
41
|
+
]
|
42
|
+
|
43
|
+
outputs = [
|
44
|
+
Output(display_name="Passed Output", name="passed_output", method="pass_through"),
|
45
|
+
]
|
46
|
+
|
47
|
+
def evaluate_condition(
|
48
|
+
self, input_value: str, comparison_value: str, operator: str, *, case_sensitive: bool
|
49
|
+
) -> bool:
|
50
|
+
if not case_sensitive:
|
51
|
+
input_value = input_value.lower()
|
52
|
+
comparison_value = comparison_value.lower()
|
53
|
+
|
54
|
+
if operator == "equals":
|
55
|
+
return input_value == comparison_value
|
56
|
+
if operator == "not equals":
|
57
|
+
return input_value != comparison_value
|
58
|
+
if operator == "contains":
|
59
|
+
return comparison_value in input_value
|
60
|
+
if operator == "starts with":
|
61
|
+
return input_value.startswith(comparison_value)
|
62
|
+
if operator == "ends with":
|
63
|
+
return input_value.endswith(comparison_value)
|
64
|
+
return False
|
65
|
+
|
66
|
+
def pass_through(self) -> Text:
|
67
|
+
input_value = self.input_value
|
68
|
+
comparison_value = self.comparison_value
|
69
|
+
operator = self.operator
|
70
|
+
value_to_pass = self.value_to_pass
|
71
|
+
case_sensitive = self.case_sensitive
|
72
|
+
|
73
|
+
if self.evaluate_condition(input_value, comparison_value, operator, case_sensitive=case_sensitive):
|
74
|
+
self.status = value_to_pass
|
75
|
+
return value_to_pass
|
76
|
+
self.status = ""
|
77
|
+
return ""
|