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,82 @@
|
|
1
|
+
import re
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.io import MessageTextInput, Output
|
5
|
+
from lfx.schema.data import Data
|
6
|
+
from lfx.schema.message import Message
|
7
|
+
|
8
|
+
|
9
|
+
class RegexExtractorComponent(Component):
|
10
|
+
display_name = "Regex Extractor"
|
11
|
+
description = "Extract patterns from text using regular expressions."
|
12
|
+
icon = "regex"
|
13
|
+
legacy = True
|
14
|
+
|
15
|
+
inputs = [
|
16
|
+
MessageTextInput(
|
17
|
+
name="input_text",
|
18
|
+
display_name="Input Text",
|
19
|
+
info="The text to analyze",
|
20
|
+
required=True,
|
21
|
+
),
|
22
|
+
MessageTextInput(
|
23
|
+
name="pattern",
|
24
|
+
display_name="Regex Pattern",
|
25
|
+
info="The regular expression pattern to match",
|
26
|
+
value=r"",
|
27
|
+
required=True,
|
28
|
+
tool_mode=True,
|
29
|
+
),
|
30
|
+
]
|
31
|
+
|
32
|
+
outputs = [
|
33
|
+
Output(display_name="Data", name="data", method="extract_matches"),
|
34
|
+
Output(display_name="Message", name="text", method="get_matches_text"),
|
35
|
+
]
|
36
|
+
|
37
|
+
def extract_matches(self) -> list[Data]:
|
38
|
+
if not self.pattern or not self.input_text:
|
39
|
+
self.status = []
|
40
|
+
return []
|
41
|
+
|
42
|
+
try:
|
43
|
+
# Compile regex pattern
|
44
|
+
pattern = re.compile(self.pattern)
|
45
|
+
|
46
|
+
# Find all matches in the input text
|
47
|
+
matches = pattern.findall(self.input_text)
|
48
|
+
|
49
|
+
# Filter out empty matches
|
50
|
+
filtered_matches = [match for match in matches if match] # Remove empty matches
|
51
|
+
|
52
|
+
# Return empty list for no matches, or list of matches if found
|
53
|
+
result: list = [] if not filtered_matches else [Data(data={"match": match}) for match in filtered_matches]
|
54
|
+
|
55
|
+
except re.error as e:
|
56
|
+
error_message = f"Invalid regex pattern: {e!s}"
|
57
|
+
result = [Data(data={"error": error_message})]
|
58
|
+
except ValueError as e:
|
59
|
+
error_message = f"Error extracting matches: {e!s}"
|
60
|
+
result = [Data(data={"error": error_message})]
|
61
|
+
|
62
|
+
self.status = result
|
63
|
+
return result
|
64
|
+
|
65
|
+
def get_matches_text(self) -> Message:
|
66
|
+
"""Get matches as a formatted text message."""
|
67
|
+
matches = self.extract_matches()
|
68
|
+
|
69
|
+
if not matches:
|
70
|
+
message = Message(text="No matches found")
|
71
|
+
self.status = message
|
72
|
+
return message
|
73
|
+
|
74
|
+
if "error" in matches[0].data:
|
75
|
+
message = Message(text=matches[0].data["error"])
|
76
|
+
self.status = message
|
77
|
+
return message
|
78
|
+
|
79
|
+
result = "\n".join(match.data["match"] for match in matches)
|
80
|
+
message = Message(text=result)
|
81
|
+
self.status = message
|
82
|
+
return message
|
@@ -0,0 +1,225 @@
|
|
1
|
+
import json
|
2
|
+
from collections.abc import AsyncIterator, Iterator
|
3
|
+
from pathlib import Path
|
4
|
+
|
5
|
+
import orjson
|
6
|
+
import pandas as pd
|
7
|
+
from fastapi import UploadFile
|
8
|
+
from fastapi.encoders import jsonable_encoder
|
9
|
+
|
10
|
+
from lfx.custom import Component
|
11
|
+
from lfx.io import DropdownInput, HandleInput, StrInput
|
12
|
+
from lfx.schema import Data, DataFrame, Message
|
13
|
+
from lfx.services.deps import get_settings_service, get_storage_service
|
14
|
+
from lfx.template.field.base import Output
|
15
|
+
|
16
|
+
|
17
|
+
class SaveToFileComponent(Component):
|
18
|
+
display_name = "Save File"
|
19
|
+
description = "Save data to a local file in the selected format."
|
20
|
+
documentation: str = "https://docs.langflow.org/components-processing#save-file"
|
21
|
+
icon = "save"
|
22
|
+
name = "SaveToFile"
|
23
|
+
|
24
|
+
# File format options for different types
|
25
|
+
DATA_FORMAT_CHOICES = ["csv", "excel", "json", "markdown"]
|
26
|
+
MESSAGE_FORMAT_CHOICES = ["txt", "json", "markdown"]
|
27
|
+
|
28
|
+
inputs = [
|
29
|
+
HandleInput(
|
30
|
+
name="input",
|
31
|
+
display_name="Input",
|
32
|
+
info="The input to save.",
|
33
|
+
dynamic=True,
|
34
|
+
input_types=["Data", "DataFrame", "Message"],
|
35
|
+
required=True,
|
36
|
+
),
|
37
|
+
StrInput(
|
38
|
+
name="file_name",
|
39
|
+
display_name="File Name",
|
40
|
+
info="Name file will be saved as (without extension).",
|
41
|
+
required=True,
|
42
|
+
),
|
43
|
+
DropdownInput(
|
44
|
+
name="file_format",
|
45
|
+
display_name="File Format",
|
46
|
+
options=list(dict.fromkeys(DATA_FORMAT_CHOICES + MESSAGE_FORMAT_CHOICES)),
|
47
|
+
info="Select the file format to save the input. If not provided, the default format will be used.",
|
48
|
+
value="",
|
49
|
+
advanced=True,
|
50
|
+
),
|
51
|
+
]
|
52
|
+
|
53
|
+
outputs = [Output(display_name="File Path", name="message", method="save_to_file")]
|
54
|
+
|
55
|
+
async def save_to_file(self) -> Message:
|
56
|
+
"""Save the input to a file and upload it, returning a confirmation message."""
|
57
|
+
# Validate inputs
|
58
|
+
if not self.file_name:
|
59
|
+
msg = "File name must be provided."
|
60
|
+
raise ValueError(msg)
|
61
|
+
if not self._get_input_type():
|
62
|
+
msg = "Input type is not set."
|
63
|
+
raise ValueError(msg)
|
64
|
+
|
65
|
+
# Validate file format based on input type
|
66
|
+
file_format = self.file_format or self._get_default_format()
|
67
|
+
allowed_formats = (
|
68
|
+
self.MESSAGE_FORMAT_CHOICES if self._get_input_type() == "Message" else self.DATA_FORMAT_CHOICES
|
69
|
+
)
|
70
|
+
if file_format not in allowed_formats:
|
71
|
+
msg = f"Invalid file format '{file_format}' for {self._get_input_type()}. Allowed: {allowed_formats}"
|
72
|
+
raise ValueError(msg)
|
73
|
+
|
74
|
+
# Prepare file path
|
75
|
+
file_path = Path(self.file_name).expanduser()
|
76
|
+
if not file_path.parent.exists():
|
77
|
+
file_path.parent.mkdir(parents=True, exist_ok=True)
|
78
|
+
file_path = self._adjust_file_path_with_format(file_path, file_format)
|
79
|
+
|
80
|
+
# Save the input to file based on type
|
81
|
+
if self._get_input_type() == "DataFrame":
|
82
|
+
confirmation = self._save_dataframe(self.input, file_path, file_format)
|
83
|
+
elif self._get_input_type() == "Data":
|
84
|
+
confirmation = self._save_data(self.input, file_path, file_format)
|
85
|
+
elif self._get_input_type() == "Message":
|
86
|
+
confirmation = await self._save_message(self.input, file_path, file_format)
|
87
|
+
else:
|
88
|
+
msg = f"Unsupported input type: {self._get_input_type()}"
|
89
|
+
raise ValueError(msg)
|
90
|
+
|
91
|
+
# Upload the saved file
|
92
|
+
await self._upload_file(file_path)
|
93
|
+
|
94
|
+
# Return the final file path and confirmation message
|
95
|
+
final_path = Path.cwd() / file_path if not file_path.is_absolute() else file_path
|
96
|
+
|
97
|
+
return Message(text=f"{confirmation} at {final_path}")
|
98
|
+
|
99
|
+
def _get_input_type(self) -> str:
|
100
|
+
"""Determine the input type based on the provided input."""
|
101
|
+
# Use exact type checking (type() is) instead of isinstance() to avoid inheritance issues.
|
102
|
+
# Since Message inherits from Data, isinstance(message, Data) would return True for Message objects,
|
103
|
+
# causing Message inputs to be incorrectly identified as Data type.
|
104
|
+
if type(self.input) is DataFrame:
|
105
|
+
return "DataFrame"
|
106
|
+
if type(self.input) is Message:
|
107
|
+
return "Message"
|
108
|
+
if type(self.input) is Data:
|
109
|
+
return "Data"
|
110
|
+
msg = f"Unsupported input type: {type(self.input)}"
|
111
|
+
raise ValueError(msg)
|
112
|
+
|
113
|
+
def _get_default_format(self) -> str:
|
114
|
+
"""Return the default file format based on input type."""
|
115
|
+
if self._get_input_type() == "DataFrame":
|
116
|
+
return "csv"
|
117
|
+
if self._get_input_type() == "Data":
|
118
|
+
return "json"
|
119
|
+
if self._get_input_type() == "Message":
|
120
|
+
return "json"
|
121
|
+
return "json" # Fallback
|
122
|
+
|
123
|
+
def _adjust_file_path_with_format(self, path: Path, fmt: str) -> Path:
|
124
|
+
"""Adjust the file path to include the correct extension."""
|
125
|
+
file_extension = path.suffix.lower().lstrip(".")
|
126
|
+
if fmt == "excel":
|
127
|
+
return Path(f"{path}.xlsx").expanduser() if file_extension not in ["xlsx", "xls"] else path
|
128
|
+
return Path(f"{path}.{fmt}").expanduser() if file_extension != fmt else path
|
129
|
+
|
130
|
+
async def _upload_file(self, file_path: Path) -> None:
|
131
|
+
"""Upload the saved file using the upload_user_file service."""
|
132
|
+
try:
|
133
|
+
from langflow.api.v2.files import upload_user_file
|
134
|
+
from langflow.services.database.models.user.crud import get_user_by_id
|
135
|
+
except ImportError as e:
|
136
|
+
msg = (
|
137
|
+
"Langflow file upload functionality is not available. "
|
138
|
+
"This feature requires the full Langflow installation. "
|
139
|
+
)
|
140
|
+
raise ImportError(msg) from e
|
141
|
+
|
142
|
+
if not file_path.exists():
|
143
|
+
msg = f"File not found: {file_path}"
|
144
|
+
raise FileNotFoundError(msg)
|
145
|
+
|
146
|
+
with file_path.open("rb") as f:
|
147
|
+
try:
|
148
|
+
from langflow.services.database.models.user.crud import get_user_by_id
|
149
|
+
from langflow.services.deps import session_scope
|
150
|
+
except ImportError as e:
|
151
|
+
msg = (
|
152
|
+
"Langflow MCP server functionality is not available. "
|
153
|
+
"This feature requires the full Langflow installation."
|
154
|
+
)
|
155
|
+
raise ImportError(msg) from e
|
156
|
+
async with session_scope() as db:
|
157
|
+
if not self.user_id:
|
158
|
+
msg = "User ID is required for file saving."
|
159
|
+
raise ValueError(msg)
|
160
|
+
current_user = await get_user_by_id(db, self.user_id)
|
161
|
+
|
162
|
+
await upload_user_file(
|
163
|
+
file=UploadFile(filename=file_path.name, file=f, size=file_path.stat().st_size),
|
164
|
+
session=db,
|
165
|
+
current_user=current_user,
|
166
|
+
storage_service=get_storage_service(),
|
167
|
+
settings_service=get_settings_service(),
|
168
|
+
)
|
169
|
+
|
170
|
+
def _save_dataframe(self, dataframe: DataFrame, path: Path, fmt: str) -> str:
|
171
|
+
"""Save a DataFrame to the specified file format."""
|
172
|
+
if fmt == "csv":
|
173
|
+
dataframe.to_csv(path, index=False)
|
174
|
+
elif fmt == "excel":
|
175
|
+
dataframe.to_excel(path, index=False, engine="openpyxl")
|
176
|
+
elif fmt == "json":
|
177
|
+
dataframe.to_json(path, orient="records", indent=2)
|
178
|
+
elif fmt == "markdown":
|
179
|
+
path.write_text(dataframe.to_markdown(index=False), encoding="utf-8")
|
180
|
+
else:
|
181
|
+
msg = f"Unsupported DataFrame format: {fmt}"
|
182
|
+
raise ValueError(msg)
|
183
|
+
return f"DataFrame saved successfully as '{path}'"
|
184
|
+
|
185
|
+
def _save_data(self, data: Data, path: Path, fmt: str) -> str:
|
186
|
+
"""Save a Data object to the specified file format."""
|
187
|
+
if fmt == "csv":
|
188
|
+
pd.DataFrame(data.data).to_csv(path, index=False)
|
189
|
+
elif fmt == "excel":
|
190
|
+
pd.DataFrame(data.data).to_excel(path, index=False, engine="openpyxl")
|
191
|
+
elif fmt == "json":
|
192
|
+
path.write_text(
|
193
|
+
orjson.dumps(jsonable_encoder(data.data), option=orjson.OPT_INDENT_2).decode("utf-8"), encoding="utf-8"
|
194
|
+
)
|
195
|
+
elif fmt == "markdown":
|
196
|
+
path.write_text(pd.DataFrame(data.data).to_markdown(index=False), encoding="utf-8")
|
197
|
+
else:
|
198
|
+
msg = f"Unsupported Data format: {fmt}"
|
199
|
+
raise ValueError(msg)
|
200
|
+
return f"Data saved successfully as '{path}'"
|
201
|
+
|
202
|
+
async def _save_message(self, message: Message, path: Path, fmt: str) -> str:
|
203
|
+
"""Save a Message to the specified file format, handling async iterators."""
|
204
|
+
content = ""
|
205
|
+
if message.text is None:
|
206
|
+
content = ""
|
207
|
+
elif isinstance(message.text, AsyncIterator):
|
208
|
+
async for item in message.text:
|
209
|
+
content += str(item) + " "
|
210
|
+
content = content.strip()
|
211
|
+
elif isinstance(message.text, Iterator):
|
212
|
+
content = " ".join(str(item) for item in message.text)
|
213
|
+
else:
|
214
|
+
content = str(message.text)
|
215
|
+
|
216
|
+
if fmt == "txt":
|
217
|
+
path.write_text(content, encoding="utf-8")
|
218
|
+
elif fmt == "json":
|
219
|
+
path.write_text(json.dumps({"message": content}, indent=2), encoding="utf-8")
|
220
|
+
elif fmt == "markdown":
|
221
|
+
path.write_text(f"**Message:**\n\n{content}", encoding="utf-8")
|
222
|
+
else:
|
223
|
+
msg = f"Unsupported Message format: {fmt}"
|
224
|
+
raise ValueError(msg)
|
225
|
+
return f"Message saved successfully as '{path}'"
|
@@ -0,0 +1,48 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.field_typing.range_spec import RangeSpec
|
3
|
+
from lfx.inputs.inputs import DataInput, IntInput
|
4
|
+
from lfx.io import Output
|
5
|
+
from lfx.schema.data import Data
|
6
|
+
|
7
|
+
|
8
|
+
class SelectDataComponent(Component):
|
9
|
+
display_name: str = "Select Data"
|
10
|
+
description: str = "Select a single data from a list of data."
|
11
|
+
name: str = "SelectData"
|
12
|
+
icon = "prototypes"
|
13
|
+
legacy = True
|
14
|
+
|
15
|
+
inputs = [
|
16
|
+
DataInput(
|
17
|
+
name="data_list",
|
18
|
+
display_name="Data List",
|
19
|
+
info="List of data to select from.",
|
20
|
+
is_list=True, # Specify that this input takes a list of Data objects
|
21
|
+
),
|
22
|
+
IntInput(
|
23
|
+
name="data_index",
|
24
|
+
display_name="Data Index",
|
25
|
+
info="Index of the data to select.",
|
26
|
+
value=0, # Will be populated dynamically based on the length of data_list
|
27
|
+
range_spec=RangeSpec(min=0, max=15, step=1, step_type="int"),
|
28
|
+
),
|
29
|
+
]
|
30
|
+
|
31
|
+
outputs = [
|
32
|
+
Output(display_name="Selected Data", name="selected_data", method="select_data"),
|
33
|
+
]
|
34
|
+
|
35
|
+
async def select_data(self) -> Data:
|
36
|
+
# Retrieve the selected index from the dropdown
|
37
|
+
selected_index = int(self.data_index)
|
38
|
+
# Get the data list
|
39
|
+
|
40
|
+
# Validate that the selected index is within bounds
|
41
|
+
if selected_index < 0 or selected_index >= len(self.data_list):
|
42
|
+
msg = f"Selected index {selected_index} is out of range."
|
43
|
+
raise ValueError(msg)
|
44
|
+
|
45
|
+
# Return the selected Data object
|
46
|
+
selected_data = self.data_list[selected_index]
|
47
|
+
self.status = selected_data # Update the component status to reflect the selected data
|
48
|
+
return selected_data
|
@@ -0,0 +1,141 @@
|
|
1
|
+
from langchain_text_splitters import CharacterTextSplitter
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.io import DropdownInput, HandleInput, IntInput, MessageTextInput, Output
|
5
|
+
from lfx.schema.data import Data
|
6
|
+
from lfx.schema.dataframe import DataFrame
|
7
|
+
from lfx.schema.message import Message
|
8
|
+
from lfx.utils.util import unescape_string
|
9
|
+
|
10
|
+
|
11
|
+
class SplitTextComponent(Component):
|
12
|
+
display_name: str = "Split Text"
|
13
|
+
description: str = "Split text into chunks based on specified criteria."
|
14
|
+
documentation: str = "https://docs.langflow.org/components-processing#split-text"
|
15
|
+
icon = "scissors-line-dashed"
|
16
|
+
name = "SplitText"
|
17
|
+
|
18
|
+
inputs = [
|
19
|
+
HandleInput(
|
20
|
+
name="data_inputs",
|
21
|
+
display_name="Input",
|
22
|
+
info="The data with texts to split in chunks.",
|
23
|
+
input_types=["Data", "DataFrame", "Message"],
|
24
|
+
required=True,
|
25
|
+
),
|
26
|
+
IntInput(
|
27
|
+
name="chunk_overlap",
|
28
|
+
display_name="Chunk Overlap",
|
29
|
+
info="Number of characters to overlap between chunks.",
|
30
|
+
value=200,
|
31
|
+
),
|
32
|
+
IntInput(
|
33
|
+
name="chunk_size",
|
34
|
+
display_name="Chunk Size",
|
35
|
+
info=(
|
36
|
+
"The maximum length of each chunk. Text is first split by separator, "
|
37
|
+
"then chunks are merged up to this size. "
|
38
|
+
"Individual splits larger than this won't be further divided."
|
39
|
+
),
|
40
|
+
value=1000,
|
41
|
+
),
|
42
|
+
MessageTextInput(
|
43
|
+
name="separator",
|
44
|
+
display_name="Separator",
|
45
|
+
info=(
|
46
|
+
"The character to split on. Use \\n for newline. "
|
47
|
+
"Examples: \\n\\n for paragraphs, \\n for lines, . for sentences"
|
48
|
+
),
|
49
|
+
value="\n",
|
50
|
+
),
|
51
|
+
MessageTextInput(
|
52
|
+
name="text_key",
|
53
|
+
display_name="Text Key",
|
54
|
+
info="The key to use for the text column.",
|
55
|
+
value="text",
|
56
|
+
advanced=True,
|
57
|
+
),
|
58
|
+
DropdownInput(
|
59
|
+
name="keep_separator",
|
60
|
+
display_name="Keep Separator",
|
61
|
+
info="Whether to keep the separator in the output chunks and where to place it.",
|
62
|
+
options=["False", "True", "Start", "End"],
|
63
|
+
value="False",
|
64
|
+
advanced=True,
|
65
|
+
),
|
66
|
+
]
|
67
|
+
|
68
|
+
outputs = [
|
69
|
+
Output(display_name="Chunks", name="dataframe", method="split_text"),
|
70
|
+
]
|
71
|
+
|
72
|
+
def _docs_to_data(self, docs) -> list[Data]:
|
73
|
+
return [Data(text=doc.page_content, data=doc.metadata) for doc in docs]
|
74
|
+
|
75
|
+
def _fix_separator(self, separator: str) -> str:
|
76
|
+
"""Fix common separator issues and convert to proper format."""
|
77
|
+
if separator == "/n":
|
78
|
+
return "\n"
|
79
|
+
if separator == "/t":
|
80
|
+
return "\t"
|
81
|
+
return separator
|
82
|
+
|
83
|
+
def split_text_base(self):
|
84
|
+
separator = self._fix_separator(self.separator)
|
85
|
+
separator = unescape_string(separator)
|
86
|
+
|
87
|
+
if isinstance(self.data_inputs, DataFrame):
|
88
|
+
if not len(self.data_inputs):
|
89
|
+
msg = "DataFrame is empty"
|
90
|
+
raise TypeError(msg)
|
91
|
+
|
92
|
+
self.data_inputs.text_key = self.text_key
|
93
|
+
try:
|
94
|
+
documents = self.data_inputs.to_lc_documents()
|
95
|
+
except Exception as e:
|
96
|
+
msg = f"Error converting DataFrame to documents: {e}"
|
97
|
+
raise TypeError(msg) from e
|
98
|
+
elif isinstance(self.data_inputs, Message):
|
99
|
+
self.data_inputs = [self.data_inputs.to_data()]
|
100
|
+
return self.split_text_base()
|
101
|
+
else:
|
102
|
+
if not self.data_inputs:
|
103
|
+
msg = "No data inputs provided"
|
104
|
+
raise TypeError(msg)
|
105
|
+
|
106
|
+
documents = []
|
107
|
+
if isinstance(self.data_inputs, Data):
|
108
|
+
self.data_inputs.text_key = self.text_key
|
109
|
+
documents = [self.data_inputs.to_lc_document()]
|
110
|
+
else:
|
111
|
+
try:
|
112
|
+
documents = [input_.to_lc_document() for input_ in self.data_inputs if isinstance(input_, Data)]
|
113
|
+
if not documents:
|
114
|
+
msg = f"No valid Data inputs found in {type(self.data_inputs)}"
|
115
|
+
raise TypeError(msg)
|
116
|
+
except AttributeError as e:
|
117
|
+
msg = f"Invalid input type in collection: {e}"
|
118
|
+
raise TypeError(msg) from e
|
119
|
+
try:
|
120
|
+
# Convert string 'False'/'True' to boolean
|
121
|
+
keep_sep = self.keep_separator
|
122
|
+
if isinstance(keep_sep, str):
|
123
|
+
if keep_sep.lower() == "false":
|
124
|
+
keep_sep = False
|
125
|
+
elif keep_sep.lower() == "true":
|
126
|
+
keep_sep = True
|
127
|
+
# 'start' and 'end' are kept as strings
|
128
|
+
|
129
|
+
splitter = CharacterTextSplitter(
|
130
|
+
chunk_overlap=self.chunk_overlap,
|
131
|
+
chunk_size=self.chunk_size,
|
132
|
+
separator=separator,
|
133
|
+
keep_separator=keep_sep,
|
134
|
+
)
|
135
|
+
return splitter.split_documents(documents)
|
136
|
+
except Exception as e:
|
137
|
+
msg = f"Error splitting text: {e}"
|
138
|
+
raise TypeError(msg) from e
|
139
|
+
|
140
|
+
def split_text(self) -> DataFrame:
|
141
|
+
return DataFrame(self._docs_to_data(self.split_text_base()))
|