lfx-nightly 0.2.0.dev25__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.
Potentially problematic release.
This version of lfx-nightly might be problematic. Click here for more details.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/_assets/component_index.json +1 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +375 -0
- lfx/base/agents/altk_base_agent.py +380 -0
- lfx/base/agents/altk_tool_wrappers.py +565 -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 +430 -0
- lfx/base/agents/utils.py +237 -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 +2584 -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 +810 -0
- lfx/base/data/docling_utils.py +338 -0
- lfx/base/data/storage_utils.py +192 -0
- lfx/base/data/utils.py +362 -0
- lfx/base/datastax/__init__.py +5 -0
- lfx/base/datastax/astradb_base.py +896 -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/embeddings_class.py +113 -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 +21 -0
- lfx/base/io/text.py +22 -0
- lfx/base/knowledge_bases/__init__.py +3 -0
- lfx/base/knowledge_bases/knowledge_base_utils.py +137 -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 +1659 -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 +51 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/cometapi_constants.py +54 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/google_generative_ai_model.py +38 -0
- lfx/base/models/groq_constants.py +150 -0
- lfx/base/models/groq_model_discovery.py +265 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +378 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +108 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +52 -0
- lfx/base/models/openai_constants.py +129 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/models/watsonx_constants.py +36 -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 +698 -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 +327 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +506 -0
- lfx/cli/script_loader.py +289 -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 +428 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +115 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/altk/__init__.py +34 -0
- lfx/components/altk/altk_agent.py +193 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_converse.py +195 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +130 -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 +169 -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 +169 -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/cometapi/__init__.py +32 -0
- lfx/components/cometapi/cometapi.py +166 -0
- lfx/components/composio/__init__.py +222 -0
- lfx/components/composio/agentql_composio.py +11 -0
- lfx/components/composio/agiled_composio.py +11 -0
- lfx/components/composio/airtable_composio.py +11 -0
- lfx/components/composio/apollo_composio.py +11 -0
- lfx/components/composio/asana_composio.py +11 -0
- lfx/components/composio/attio_composio.py +11 -0
- lfx/components/composio/bitbucket_composio.py +11 -0
- lfx/components/composio/bolna_composio.py +11 -0
- lfx/components/composio/brightdata_composio.py +11 -0
- lfx/components/composio/calendly_composio.py +11 -0
- lfx/components/composio/canva_composio.py +11 -0
- lfx/components/composio/canvas_composio.py +11 -0
- lfx/components/composio/coda_composio.py +11 -0
- lfx/components/composio/composio_api.py +278 -0
- lfx/components/composio/contentful_composio.py +11 -0
- lfx/components/composio/digicert_composio.py +11 -0
- lfx/components/composio/discord_composio.py +11 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/elevenlabs_composio.py +11 -0
- lfx/components/composio/exa_composio.py +11 -0
- lfx/components/composio/figma_composio.py +11 -0
- lfx/components/composio/finage_composio.py +11 -0
- lfx/components/composio/firecrawl_composio.py +11 -0
- lfx/components/composio/fireflies_composio.py +11 -0
- lfx/components/composio/fixer_composio.py +11 -0
- lfx/components/composio/flexisign_composio.py +11 -0
- lfx/components/composio/freshdesk_composio.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlebigquery_composio.py +11 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googleclassroom_composio.py +11 -0
- lfx/components/composio/googledocs_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googlesheets_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/heygen_composio.py +11 -0
- lfx/components/composio/instagram_composio.py +11 -0
- lfx/components/composio/jira_composio.py +11 -0
- lfx/components/composio/jotform_composio.py +11 -0
- lfx/components/composio/klaviyo_composio.py +11 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/listennotes_composio.py +11 -0
- lfx/components/composio/mem0_composio.py +11 -0
- lfx/components/composio/miro_composio.py +11 -0
- lfx/components/composio/missive_composio.py +11 -0
- lfx/components/composio/notion_composio.py +11 -0
- lfx/components/composio/onedrive_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/pandadoc_composio.py +11 -0
- lfx/components/composio/peopledatalabs_composio.py +11 -0
- lfx/components/composio/perplexityai_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/serpapi_composio.py +11 -0
- lfx/components/composio/slack_composio.py +11 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/snowflake_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/tavily_composio.py +11 -0
- lfx/components/composio/timelinesai_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/wrike_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 +108 -0
- lfx/components/crewai/hierarchical_crew.py +47 -0
- lfx/components/crewai/hierarchical_task.py +45 -0
- lfx/components/crewai/sequential_crew.py +53 -0
- lfx/components/crewai/sequential_task.py +74 -0
- lfx/components/crewai/sequential_task_agent.py +144 -0
- lfx/components/cuga/__init__.py +34 -0
- lfx/components/cuga/cuga_agent.py +730 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +114 -0
- lfx/components/data_source/__init__.py +58 -0
- lfx/components/data_source/api_request.py +577 -0
- lfx/components/data_source/csv_to_data.py +101 -0
- lfx/components/data_source/json_to_data.py +106 -0
- lfx/components/data_source/mock_data.py +398 -0
- lfx/components/data_source/news_search.py +166 -0
- lfx/components/data_source/rss.py +71 -0
- lfx/components/data_source/sql_executor.py +101 -0
- lfx/components/data_source/url.py +311 -0
- lfx/components/data_source/web_search.py +326 -0
- lfx/components/datastax/__init__.py +76 -0
- lfx/components/datastax/astradb_assistant_manager.py +307 -0
- lfx/components/datastax/astradb_chatmemory.py +40 -0
- lfx/components/datastax/astradb_cql.py +288 -0
- lfx/components/datastax/astradb_graph.py +217 -0
- lfx/components/datastax/astradb_tool.py +378 -0
- lfx/components/datastax/astradb_vectorize.py +122 -0
- lfx/components/datastax/astradb_vectorstore.py +449 -0
- lfx/components/datastax/create_assistant.py +59 -0
- lfx/components/datastax/create_thread.py +33 -0
- lfx/components/datastax/dotenv.py +36 -0
- lfx/components/datastax/get_assistant.py +38 -0
- lfx/components/datastax/getenvvar.py +31 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +315 -0
- lfx/components/datastax/list_assistants.py +26 -0
- lfx/components/datastax/run.py +90 -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 +238 -0
- lfx/components/docling/docling_remote.py +195 -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 +789 -0
- lfx/components/elastic/opensearch_multimodal.py +1575 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +77 -0
- lfx/components/embeddings/text_embedder.py +65 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/files_and_knowledge/__init__.py +47 -0
- lfx/components/files_and_knowledge/directory.py +113 -0
- lfx/components/files_and_knowledge/file.py +841 -0
- lfx/components/files_and_knowledge/ingestion.py +694 -0
- lfx/components/files_and_knowledge/retrieval.py +264 -0
- lfx/components/files_and_knowledge/save_file.py +746 -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/flow_controls/__init__.py +58 -0
- lfx/components/flow_controls/conditional_router.py +208 -0
- lfx/components/flow_controls/data_conditional_router.py +126 -0
- lfx/components/flow_controls/flow_tool.py +111 -0
- lfx/components/flow_controls/listen.py +29 -0
- lfx/components/flow_controls/loop.py +163 -0
- lfx/components/flow_controls/notify.py +88 -0
- lfx/components/flow_controls/pass_message.py +36 -0
- lfx/components/flow_controls/run_flow.py +108 -0
- lfx/components/flow_controls/sub_flow.py +115 -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 +193 -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 +144 -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 +143 -0
- lfx/components/helpers/__init__.py +154 -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 +199 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +207 -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 +40 -0
- lfx/components/input_output/chat.py +109 -0
- lfx/components/input_output/chat_output.py +184 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/input_output/webhook.py +56 -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/knowledge_bases/__init__.py +89 -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 +175 -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 +100 -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/llm_operations/__init__.py +46 -0
- lfx/components/llm_operations/batch_run.py +205 -0
- lfx/components/llm_operations/lambda_filter.py +218 -0
- lfx/components/llm_operations/llm_conditional_router.py +421 -0
- lfx/components/llm_operations/llm_selector.py +499 -0
- lfx/components/llm_operations/structured_output.py +244 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +133 -0
- lfx/components/logic/__init__.py +181 -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 +147 -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 +89 -0
- lfx/components/models_and_agents/__init__.py +49 -0
- lfx/components/models_and_agents/agent.py +644 -0
- lfx/components/models_and_agents/embedding_model.py +423 -0
- lfx/components/models_and_agents/language_model.py +398 -0
- lfx/components/models_and_agents/mcp_component.py +594 -0
- lfx/components/models_and_agents/memory.py +268 -0
- lfx/components/models_and_agents/prompt.py +67 -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 +151 -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 +548 -0
- lfx/components/ollama/ollama_embeddings.py +103 -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 +104 -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 +72 -0
- lfx/components/processing/alter_metadata.py +109 -0
- lfx/components/processing/combine_text.py +40 -0
- lfx/components/processing/converter.py +248 -0
- lfx/components/processing/create_data.py +111 -0
- lfx/components/processing/create_list.py +40 -0
- lfx/components/processing/data_operations.py +528 -0
- lfx/components/processing/data_to_dataframe.py +71 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/dataframe_to_toolset.py +259 -0
- lfx/components/processing/dynamic_create_data.py +357 -0
- lfx/components/processing/extract_key.py +54 -0
- lfx/components/processing/filter_data.py +43 -0
- lfx/components/processing/filter_data_values.py +89 -0
- lfx/components/processing/json_cleaner.py +104 -0
- lfx/components/processing/merge_data.py +91 -0
- lfx/components/processing/message_to_data.py +37 -0
- lfx/components/processing/output_parser.py +46 -0
- lfx/components/processing/parse_data.py +71 -0
- lfx/components/processing/parse_dataframe.py +69 -0
- lfx/components/processing/parse_json_data.py +91 -0
- lfx/components/processing/parser.py +148 -0
- lfx/components/processing/regex.py +83 -0
- lfx/components/processing/select_data.py +49 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/store_message.py +91 -0
- lfx/components/processing/update_data.py +161 -0
- lfx/components/prototypes/__init__.py +35 -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 +66 -0
- lfx/components/tools/calculator.py +109 -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 +328 -0
- lfx/components/tools/python_repl.py +98 -0
- lfx/components/tools/search_api.py +88 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +120 -0
- lfx/components/tools/tavily_search_tool.py +345 -0
- lfx/components/tools/wikidata_api.py +103 -0
- lfx/components/tools/wikipedia_api.py +50 -0
- lfx/components/tools/yahoo_finance.py +130 -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 +301 -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 +191 -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/utilities/__init__.py +43 -0
- lfx/components/utilities/calculator_core.py +89 -0
- lfx/components/utilities/current_date.py +42 -0
- lfx/components/utilities/id_generator.py +42 -0
- lfx/components/utilities/python_repl_core.py +98 -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 +34 -0
- lfx/components/vectorstores/local_db.py +270 -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/vlmrun/__init__.py +34 -0
- lfx/components/vlmrun/vlmrun_transcription.py +224 -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 +206 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +45 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +87 -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 +1890 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +650 -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 +523 -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 +216 -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 +300 -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 +2298 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +53 -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 +250 -0
- lfx/graph/utils.py +206 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +826 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +316 -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 +141 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +308 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +352 -0
- lfx/inputs/inputs.py +718 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +897 -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 +317 -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 +295 -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 +411 -0
- lfx/logging/__init__.py +11 -0
- lfx/logging/logger.py +24 -0
- lfx/memory/__init__.py +70 -0
- lfx/memory/stubs.py +302 -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/cross_module.py +80 -0
- lfx/schema/data.py +309 -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 +184 -0
- lfx/schema/json_schema.py +186 -0
- lfx/schema/log.py +62 -0
- lfx/schema/message.py +493 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +180 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +142 -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 +26 -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/database/__init__.py +5 -0
- lfx/services/database/service.py +25 -0
- lfx/services/deps.py +194 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +185 -0
- lfx/services/mcp_composer/__init__.py +6 -0
- lfx/services/mcp_composer/factory.py +16 -0
- lfx/services/mcp_composer/service.py +1441 -0
- lfx/services/schema.py +21 -0
- lfx/services/session.py +87 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +133 -0
- lfx/services/settings/base.py +668 -0
- lfx/services/settings/constants.py +43 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +11 -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 +185 -0
- lfx/services/storage/service.py +177 -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 +260 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +214 -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 +233 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +34 -0
- lfx/utils/image.py +79 -0
- lfx/utils/langflow_utils.py +52 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/ssrf_protection.py +384 -0
- lfx/utils/util.py +626 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/validate_cloud.py +26 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
- lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
- lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
- lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from enum import Enum
|
|
2
|
+
from typing import cast
|
|
3
|
+
|
|
4
|
+
from lfx.custom.custom_component.component import Component
|
|
5
|
+
from lfx.io import DataInput, DropdownInput, Output
|
|
6
|
+
from lfx.log.logger import logger
|
|
7
|
+
from lfx.schema.dataframe import DataFrame
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class DataOperation(str, Enum):
|
|
11
|
+
CONCATENATE = "Concatenate"
|
|
12
|
+
APPEND = "Append"
|
|
13
|
+
MERGE = "Merge"
|
|
14
|
+
JOIN = "Join"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class MergeDataComponent(Component):
|
|
18
|
+
display_name = "Combine Data"
|
|
19
|
+
description = "Combines data using different operations"
|
|
20
|
+
icon = "merge"
|
|
21
|
+
MIN_INPUTS_REQUIRED = 2
|
|
22
|
+
legacy = True
|
|
23
|
+
replacement = ["processing.DataOperations"]
|
|
24
|
+
|
|
25
|
+
inputs = [
|
|
26
|
+
DataInput(name="data_inputs", display_name="Data Inputs", info="Data to combine", is_list=True, required=True),
|
|
27
|
+
DropdownInput(
|
|
28
|
+
name="operation",
|
|
29
|
+
display_name="Operation Type",
|
|
30
|
+
options=[op.value for op in DataOperation],
|
|
31
|
+
value=DataOperation.CONCATENATE.value,
|
|
32
|
+
),
|
|
33
|
+
]
|
|
34
|
+
outputs = [Output(display_name="DataFrame", name="combined_data", method="combine_data")]
|
|
35
|
+
|
|
36
|
+
def combine_data(self) -> DataFrame:
|
|
37
|
+
if not self.data_inputs or len(self.data_inputs) < self.MIN_INPUTS_REQUIRED:
|
|
38
|
+
empty_dataframe = DataFrame()
|
|
39
|
+
self.status = empty_dataframe
|
|
40
|
+
return empty_dataframe
|
|
41
|
+
|
|
42
|
+
operation = DataOperation(self.operation)
|
|
43
|
+
try:
|
|
44
|
+
combined_dataframe = self._process_operation(operation)
|
|
45
|
+
self.status = combined_dataframe
|
|
46
|
+
except Exception as e:
|
|
47
|
+
logger.error(f"Error during operation {operation}: {e!s}")
|
|
48
|
+
raise
|
|
49
|
+
else:
|
|
50
|
+
return combined_dataframe
|
|
51
|
+
|
|
52
|
+
def _process_operation(self, operation: DataOperation) -> DataFrame:
|
|
53
|
+
if operation == DataOperation.CONCATENATE:
|
|
54
|
+
combined_data: dict[str, str | object] = {}
|
|
55
|
+
for data_input in self.data_inputs:
|
|
56
|
+
for key, value in data_input.data.items():
|
|
57
|
+
if key in combined_data:
|
|
58
|
+
if isinstance(combined_data[key], str) and isinstance(value, str):
|
|
59
|
+
combined_data[key] = f"{combined_data[key]}\n{value}"
|
|
60
|
+
else:
|
|
61
|
+
combined_data[key] = value
|
|
62
|
+
else:
|
|
63
|
+
combined_data[key] = value
|
|
64
|
+
return DataFrame([combined_data])
|
|
65
|
+
|
|
66
|
+
if operation == DataOperation.APPEND:
|
|
67
|
+
rows = [data_input.data for data_input in self.data_inputs]
|
|
68
|
+
return DataFrame(rows)
|
|
69
|
+
|
|
70
|
+
if operation == DataOperation.MERGE:
|
|
71
|
+
result_data: dict[str, str | list[str] | object] = {}
|
|
72
|
+
for data_input in self.data_inputs:
|
|
73
|
+
for key, value in data_input.data.items():
|
|
74
|
+
if key in result_data and isinstance(value, str):
|
|
75
|
+
if isinstance(result_data[key], list):
|
|
76
|
+
cast("list[str]", result_data[key]).append(value)
|
|
77
|
+
else:
|
|
78
|
+
result_data[key] = [result_data[key], value]
|
|
79
|
+
else:
|
|
80
|
+
result_data[key] = value
|
|
81
|
+
return DataFrame([result_data])
|
|
82
|
+
|
|
83
|
+
if operation == DataOperation.JOIN:
|
|
84
|
+
combined_data = {}
|
|
85
|
+
for idx, data_input in enumerate(self.data_inputs, 1):
|
|
86
|
+
for key, value in data_input.data.items():
|
|
87
|
+
new_key = f"{key}_doc{idx}" if idx > 1 else key
|
|
88
|
+
combined_data[new_key] = value
|
|
89
|
+
return DataFrame([combined_data])
|
|
90
|
+
|
|
91
|
+
return DataFrame()
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
from lfx.io import MessageInput, Output
|
|
3
|
+
from lfx.log.logger import logger
|
|
4
|
+
from lfx.schema.data import Data
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class MessageToDataComponent(Component):
|
|
8
|
+
display_name = "Message to Data"
|
|
9
|
+
description = "Convert a Message object to a Data object"
|
|
10
|
+
icon = "message-square-share"
|
|
11
|
+
beta = True
|
|
12
|
+
name = "MessagetoData"
|
|
13
|
+
legacy = True
|
|
14
|
+
replacement = ["processing.TypeConverterComponent"]
|
|
15
|
+
|
|
16
|
+
inputs = [
|
|
17
|
+
MessageInput(
|
|
18
|
+
name="message",
|
|
19
|
+
display_name="Message",
|
|
20
|
+
info="The Message object to convert to a Data object",
|
|
21
|
+
),
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
outputs = [
|
|
25
|
+
Output(display_name="Data", name="data", method="convert_message_to_data"),
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
def convert_message_to_data(self) -> Data:
|
|
29
|
+
# Check for Message by checking if it has the expected attributes instead of isinstance
|
|
30
|
+
if hasattr(self.message, "data") and hasattr(self.message, "text") and hasattr(self.message, "get_text"):
|
|
31
|
+
# Convert Message to Data - this works for both langflow.Message and lfx.Message
|
|
32
|
+
return Data(data=self.message.data)
|
|
33
|
+
|
|
34
|
+
msg = "Error converting Message to Data: Input must be a Message object"
|
|
35
|
+
logger.debug(msg, exc_info=True)
|
|
36
|
+
self.status = msg
|
|
37
|
+
return Data(data={"error": msg})
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from langchain_core.output_parsers import CommaSeparatedListOutputParser
|
|
2
|
+
|
|
3
|
+
from lfx.custom.custom_component.component import Component
|
|
4
|
+
from lfx.field_typing.constants import OutputParser
|
|
5
|
+
from lfx.io import DropdownInput, Output
|
|
6
|
+
from lfx.schema.message import Message
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class OutputParserComponent(Component):
|
|
10
|
+
display_name = "Output Parser"
|
|
11
|
+
description = "Transforms the output of an LLM into a specified format."
|
|
12
|
+
icon = "type"
|
|
13
|
+
name = "OutputParser"
|
|
14
|
+
legacy = True
|
|
15
|
+
replacement = ["processing.StructuredOutput", "processing.ParserComponent"]
|
|
16
|
+
|
|
17
|
+
inputs = [
|
|
18
|
+
DropdownInput(
|
|
19
|
+
name="parser_type",
|
|
20
|
+
display_name="Parser",
|
|
21
|
+
options=["CSV"],
|
|
22
|
+
value="CSV",
|
|
23
|
+
),
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
outputs = [
|
|
27
|
+
Output(
|
|
28
|
+
display_name="Format Instructions",
|
|
29
|
+
name="format_instructions",
|
|
30
|
+
info="Pass to a prompt template to include formatting instructions for LLM responses.",
|
|
31
|
+
method="format_instructions",
|
|
32
|
+
),
|
|
33
|
+
Output(display_name="Output Parser", name="output_parser", method="build_parser"),
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
def build_parser(self) -> OutputParser:
|
|
37
|
+
if self.parser_type == "CSV":
|
|
38
|
+
return CommaSeparatedListOutputParser()
|
|
39
|
+
msg = "Unsupported or missing parser"
|
|
40
|
+
raise ValueError(msg)
|
|
41
|
+
|
|
42
|
+
def format_instructions(self) -> Message:
|
|
43
|
+
if self.parser_type == "CSV":
|
|
44
|
+
return Message(text=CommaSeparatedListOutputParser().get_format_instructions())
|
|
45
|
+
msg = "Unsupported or missing parser"
|
|
46
|
+
raise ValueError(msg)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
from lfx.helpers.data import data_to_text, data_to_text_list
|
|
3
|
+
from lfx.io import DataInput, MultilineInput, Output, StrInput
|
|
4
|
+
from lfx.schema.data import Data
|
|
5
|
+
from lfx.schema.message import Message
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ParseDataComponent(Component):
|
|
9
|
+
display_name = "Data to Message"
|
|
10
|
+
description = "Convert Data objects into Messages using any {field_name} from input data."
|
|
11
|
+
icon = "message-square"
|
|
12
|
+
name = "ParseData"
|
|
13
|
+
legacy = True
|
|
14
|
+
replacement = ["processing.DataOperations", "processing.TypeConverterComponent"]
|
|
15
|
+
metadata = {
|
|
16
|
+
"legacy_name": "Parse Data",
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
inputs = [
|
|
20
|
+
DataInput(
|
|
21
|
+
name="data",
|
|
22
|
+
display_name="Data",
|
|
23
|
+
info="The data to convert to text.",
|
|
24
|
+
is_list=True,
|
|
25
|
+
required=True,
|
|
26
|
+
),
|
|
27
|
+
MultilineInput(
|
|
28
|
+
name="template",
|
|
29
|
+
display_name="Template",
|
|
30
|
+
info="The template to use for formatting the data. "
|
|
31
|
+
"It can contain the keys {text}, {data} or any other key in the Data.",
|
|
32
|
+
value="{text}",
|
|
33
|
+
required=True,
|
|
34
|
+
),
|
|
35
|
+
StrInput(name="sep", display_name="Separator", advanced=True, value="\n"),
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
outputs = [
|
|
39
|
+
Output(
|
|
40
|
+
display_name="Message",
|
|
41
|
+
name="text",
|
|
42
|
+
info="Data as a single Message, with each input Data separated by Separator",
|
|
43
|
+
method="parse_data",
|
|
44
|
+
),
|
|
45
|
+
Output(
|
|
46
|
+
display_name="Data List",
|
|
47
|
+
name="data_list",
|
|
48
|
+
info="Data as a list of new Data, each having `text` formatted by Template",
|
|
49
|
+
method="parse_data_as_list",
|
|
50
|
+
),
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
def _clean_args(self) -> tuple[list[Data], str, str]:
|
|
54
|
+
data = self.data if isinstance(self.data, list) else [self.data]
|
|
55
|
+
template = self.template
|
|
56
|
+
sep = self.sep
|
|
57
|
+
return data, template, sep
|
|
58
|
+
|
|
59
|
+
def parse_data(self) -> Message:
|
|
60
|
+
data, template, sep = self._clean_args()
|
|
61
|
+
result_string = data_to_text(template, data, sep)
|
|
62
|
+
self.status = result_string
|
|
63
|
+
return Message(text=result_string)
|
|
64
|
+
|
|
65
|
+
def parse_data_as_list(self) -> list[Data]:
|
|
66
|
+
data, template, _ = self._clean_args()
|
|
67
|
+
text_list, data_list = data_to_text_list(template, data)
|
|
68
|
+
for item, text in zip(data_list, text_list, strict=True):
|
|
69
|
+
item.set_text(text)
|
|
70
|
+
self.status = data_list
|
|
71
|
+
return data_list
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
from lfx.io import DataFrameInput, MultilineInput, Output, StrInput
|
|
3
|
+
from lfx.schema.message import Message
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ParseDataFrameComponent(Component):
|
|
7
|
+
display_name = "Parse DataFrame"
|
|
8
|
+
description = (
|
|
9
|
+
"Convert a DataFrame into plain text following a specified template. "
|
|
10
|
+
"Each column in the DataFrame is treated as a possible template key, e.g. {col_name}."
|
|
11
|
+
)
|
|
12
|
+
icon = "braces"
|
|
13
|
+
name = "ParseDataFrame"
|
|
14
|
+
legacy = True
|
|
15
|
+
replacement = ["processing.DataFrameOperations", "processing.TypeConverterComponent"]
|
|
16
|
+
|
|
17
|
+
inputs = [
|
|
18
|
+
DataFrameInput(name="df", display_name="DataFrame", info="The DataFrame to convert to text rows."),
|
|
19
|
+
MultilineInput(
|
|
20
|
+
name="template",
|
|
21
|
+
display_name="Template",
|
|
22
|
+
info=(
|
|
23
|
+
"The template for formatting each row. "
|
|
24
|
+
"Use placeholders matching column names in the DataFrame, for example '{col1}', '{col2}'."
|
|
25
|
+
),
|
|
26
|
+
value="{text}",
|
|
27
|
+
),
|
|
28
|
+
StrInput(
|
|
29
|
+
name="sep",
|
|
30
|
+
display_name="Separator",
|
|
31
|
+
advanced=True,
|
|
32
|
+
value="\n",
|
|
33
|
+
info="String that joins all row texts when building the single Text output.",
|
|
34
|
+
),
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
outputs = [
|
|
38
|
+
Output(
|
|
39
|
+
display_name="Text",
|
|
40
|
+
name="text",
|
|
41
|
+
info="All rows combined into a single text, each row formatted by the template and separated by `sep`.",
|
|
42
|
+
method="parse_data",
|
|
43
|
+
),
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
def _clean_args(self):
|
|
47
|
+
dataframe = self.df
|
|
48
|
+
template = self.template or "{text}"
|
|
49
|
+
sep = self.sep or "\n"
|
|
50
|
+
return dataframe, template, sep
|
|
51
|
+
|
|
52
|
+
def parse_data(self) -> Message:
|
|
53
|
+
"""Converts each row of the DataFrame into a formatted string using the template.
|
|
54
|
+
|
|
55
|
+
then joins them with `sep`. Returns a single combined string as a Message.
|
|
56
|
+
"""
|
|
57
|
+
dataframe, template, sep = self._clean_args()
|
|
58
|
+
|
|
59
|
+
lines = []
|
|
60
|
+
# For each row in the DataFrame, build a dict and format
|
|
61
|
+
for _, row in dataframe.iterrows():
|
|
62
|
+
row_dict = row.to_dict()
|
|
63
|
+
text_line = template.format(**row_dict) # e.g. template="{text}", row_dict={"text": "Hello"}
|
|
64
|
+
lines.append(text_line)
|
|
65
|
+
|
|
66
|
+
# Join all lines with the provided separator
|
|
67
|
+
result_string = sep.join(lines)
|
|
68
|
+
self.status = result_string # store in self.status for UI logs
|
|
69
|
+
return Message(text=result_string)
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from json import JSONDecodeError
|
|
3
|
+
|
|
4
|
+
import jq
|
|
5
|
+
from json_repair import repair_json
|
|
6
|
+
|
|
7
|
+
from lfx.custom.custom_component.component import Component
|
|
8
|
+
from lfx.inputs.inputs import HandleInput, MessageTextInput
|
|
9
|
+
from lfx.io import Output
|
|
10
|
+
from lfx.log.logger import logger
|
|
11
|
+
from lfx.schema.data import Data
|
|
12
|
+
from lfx.schema.message import Message
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ParseJSONDataComponent(Component):
|
|
16
|
+
display_name = "Parse JSON"
|
|
17
|
+
description = "Convert and extract JSON fields."
|
|
18
|
+
icon = "braces"
|
|
19
|
+
name = "ParseJSONData"
|
|
20
|
+
legacy: bool = True
|
|
21
|
+
replacement = ["processing.ParserComponent"]
|
|
22
|
+
|
|
23
|
+
inputs = [
|
|
24
|
+
HandleInput(
|
|
25
|
+
name="input_value",
|
|
26
|
+
display_name="Input",
|
|
27
|
+
info="Data object to filter.",
|
|
28
|
+
required=True,
|
|
29
|
+
input_types=["Message", "Data"],
|
|
30
|
+
),
|
|
31
|
+
MessageTextInput(
|
|
32
|
+
name="query",
|
|
33
|
+
display_name="JQ Query",
|
|
34
|
+
info="JQ Query to filter the data. The input is always a JSON list.",
|
|
35
|
+
required=True,
|
|
36
|
+
),
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
outputs = [
|
|
40
|
+
Output(display_name="Filtered Data", name="filtered_data", method="filter_data"),
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
def _parse_data(self, input_value) -> str:
|
|
44
|
+
if isinstance(input_value, Message) and isinstance(input_value.text, str):
|
|
45
|
+
return input_value.text
|
|
46
|
+
if isinstance(input_value, Data):
|
|
47
|
+
return json.dumps(input_value.data)
|
|
48
|
+
return str(input_value)
|
|
49
|
+
|
|
50
|
+
def filter_data(self) -> list[Data]:
|
|
51
|
+
to_filter = self.input_value
|
|
52
|
+
if not to_filter:
|
|
53
|
+
return []
|
|
54
|
+
# Check if input is a list
|
|
55
|
+
if isinstance(to_filter, list):
|
|
56
|
+
to_filter = [self._parse_data(f) for f in to_filter]
|
|
57
|
+
else:
|
|
58
|
+
to_filter = self._parse_data(to_filter)
|
|
59
|
+
|
|
60
|
+
# If input is not a list, don't wrap it in a list
|
|
61
|
+
if not isinstance(to_filter, list):
|
|
62
|
+
to_filter = repair_json(to_filter)
|
|
63
|
+
try:
|
|
64
|
+
to_filter_as_dict = json.loads(to_filter)
|
|
65
|
+
except JSONDecodeError:
|
|
66
|
+
try:
|
|
67
|
+
to_filter_as_dict = json.loads(repair_json(to_filter))
|
|
68
|
+
except JSONDecodeError as e:
|
|
69
|
+
msg = f"Invalid JSON: {e}"
|
|
70
|
+
raise ValueError(msg) from e
|
|
71
|
+
else:
|
|
72
|
+
to_filter = [repair_json(f) for f in to_filter]
|
|
73
|
+
to_filter_as_dict = []
|
|
74
|
+
for f in to_filter:
|
|
75
|
+
try:
|
|
76
|
+
to_filter_as_dict.append(json.loads(f))
|
|
77
|
+
except JSONDecodeError:
|
|
78
|
+
try:
|
|
79
|
+
to_filter_as_dict.append(json.loads(repair_json(f)))
|
|
80
|
+
except JSONDecodeError as e:
|
|
81
|
+
msg = f"Invalid JSON: {e}"
|
|
82
|
+
raise ValueError(msg) from e
|
|
83
|
+
to_filter = to_filter_as_dict
|
|
84
|
+
|
|
85
|
+
full_filter_str = json.dumps(to_filter_as_dict)
|
|
86
|
+
|
|
87
|
+
logger.info("to_filter: %s", to_filter)
|
|
88
|
+
|
|
89
|
+
results = jq.compile(self.query).input_text(full_filter_str).all()
|
|
90
|
+
logger.info("results: %s", results)
|
|
91
|
+
return [Data(data=value) if isinstance(value, dict) else Data(text=str(value)) for value in results]
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
from lfx.helpers.data import safe_convert
|
|
3
|
+
from lfx.inputs.inputs import BoolInput, HandleInput, MessageTextInput, MultilineInput, TabInput
|
|
4
|
+
from lfx.schema.data import Data
|
|
5
|
+
from lfx.schema.dataframe import DataFrame
|
|
6
|
+
from lfx.schema.message import Message
|
|
7
|
+
from lfx.template.field.base import Output
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ParserComponent(Component):
|
|
11
|
+
display_name = "Parser"
|
|
12
|
+
description = "Extracts text using a template."
|
|
13
|
+
documentation: str = "https://docs.langflow.org/parser"
|
|
14
|
+
icon = "braces"
|
|
15
|
+
|
|
16
|
+
inputs = [
|
|
17
|
+
HandleInput(
|
|
18
|
+
name="input_data",
|
|
19
|
+
display_name="Data or DataFrame",
|
|
20
|
+
input_types=["DataFrame", "Data"],
|
|
21
|
+
info="Accepts either a DataFrame or a Data object.",
|
|
22
|
+
required=True,
|
|
23
|
+
),
|
|
24
|
+
TabInput(
|
|
25
|
+
name="mode",
|
|
26
|
+
display_name="Mode",
|
|
27
|
+
options=["Parser", "Stringify"],
|
|
28
|
+
value="Parser",
|
|
29
|
+
info="Convert into raw string instead of using a template.",
|
|
30
|
+
real_time_refresh=True,
|
|
31
|
+
),
|
|
32
|
+
MultilineInput(
|
|
33
|
+
name="pattern",
|
|
34
|
+
display_name="Template",
|
|
35
|
+
info=(
|
|
36
|
+
"Use variables within curly brackets to extract column values for DataFrames "
|
|
37
|
+
"or key values for Data."
|
|
38
|
+
"For example: `Name: {Name}, Age: {Age}, Country: {Country}`"
|
|
39
|
+
),
|
|
40
|
+
value="Text: {text}", # Example default
|
|
41
|
+
dynamic=True,
|
|
42
|
+
show=True,
|
|
43
|
+
required=True,
|
|
44
|
+
),
|
|
45
|
+
MessageTextInput(
|
|
46
|
+
name="sep",
|
|
47
|
+
display_name="Separator",
|
|
48
|
+
advanced=True,
|
|
49
|
+
value="\n",
|
|
50
|
+
info="String used to separate rows/items.",
|
|
51
|
+
),
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
outputs = [
|
|
55
|
+
Output(
|
|
56
|
+
display_name="Parsed Text",
|
|
57
|
+
name="parsed_text",
|
|
58
|
+
info="Formatted text output.",
|
|
59
|
+
method="parse_combined_text",
|
|
60
|
+
),
|
|
61
|
+
]
|
|
62
|
+
|
|
63
|
+
def update_build_config(self, build_config, field_value, field_name=None):
|
|
64
|
+
"""Dynamically hide/show `template` and enforce requirement based on `stringify`."""
|
|
65
|
+
if field_name == "mode":
|
|
66
|
+
build_config["pattern"]["show"] = self.mode == "Parser"
|
|
67
|
+
build_config["pattern"]["required"] = self.mode == "Parser"
|
|
68
|
+
if field_value:
|
|
69
|
+
clean_data = BoolInput(
|
|
70
|
+
name="clean_data",
|
|
71
|
+
display_name="Clean Data",
|
|
72
|
+
info=(
|
|
73
|
+
"Enable to clean the data by removing empty rows and lines "
|
|
74
|
+
"in each cell of the DataFrame/ Data object."
|
|
75
|
+
),
|
|
76
|
+
value=True,
|
|
77
|
+
advanced=True,
|
|
78
|
+
required=False,
|
|
79
|
+
)
|
|
80
|
+
build_config["clean_data"] = clean_data.to_dict()
|
|
81
|
+
else:
|
|
82
|
+
build_config.pop("clean_data", None)
|
|
83
|
+
|
|
84
|
+
return build_config
|
|
85
|
+
|
|
86
|
+
def _clean_args(self):
|
|
87
|
+
"""Prepare arguments based on input type."""
|
|
88
|
+
input_data = self.input_data
|
|
89
|
+
|
|
90
|
+
match input_data:
|
|
91
|
+
case list() if all(isinstance(item, Data) for item in input_data):
|
|
92
|
+
msg = "List of Data objects is not supported."
|
|
93
|
+
raise ValueError(msg)
|
|
94
|
+
case DataFrame():
|
|
95
|
+
return input_data, None
|
|
96
|
+
case Data():
|
|
97
|
+
return None, input_data
|
|
98
|
+
case dict() if "data" in input_data:
|
|
99
|
+
try:
|
|
100
|
+
if "columns" in input_data: # Likely a DataFrame
|
|
101
|
+
return DataFrame.from_dict(input_data), None
|
|
102
|
+
# Likely a Data object
|
|
103
|
+
return None, Data(**input_data)
|
|
104
|
+
except (TypeError, ValueError, KeyError) as e:
|
|
105
|
+
msg = f"Invalid structured input provided: {e!s}"
|
|
106
|
+
raise ValueError(msg) from e
|
|
107
|
+
case _:
|
|
108
|
+
msg = f"Unsupported input type: {type(input_data)}. Expected DataFrame or Data."
|
|
109
|
+
raise ValueError(msg)
|
|
110
|
+
|
|
111
|
+
def parse_combined_text(self) -> Message:
|
|
112
|
+
"""Parse all rows/items into a single text or convert input to string if `stringify` is enabled."""
|
|
113
|
+
# Early return for stringify option
|
|
114
|
+
if self.mode == "Stringify":
|
|
115
|
+
return self.convert_to_string()
|
|
116
|
+
|
|
117
|
+
df, data = self._clean_args()
|
|
118
|
+
|
|
119
|
+
lines = []
|
|
120
|
+
if df is not None:
|
|
121
|
+
for _, row in df.iterrows():
|
|
122
|
+
formatted_text = self.pattern.format(**row.to_dict())
|
|
123
|
+
lines.append(formatted_text)
|
|
124
|
+
elif data is not None:
|
|
125
|
+
# Use format_map with a dict that returns default_value for missing keys
|
|
126
|
+
class DefaultDict(dict):
|
|
127
|
+
def __missing__(self, key):
|
|
128
|
+
return data.default_value or ""
|
|
129
|
+
|
|
130
|
+
formatted_text = self.pattern.format_map(DefaultDict(data.data))
|
|
131
|
+
lines.append(formatted_text)
|
|
132
|
+
|
|
133
|
+
combined_text = self.sep.join(lines)
|
|
134
|
+
self.status = combined_text
|
|
135
|
+
return Message(text=combined_text)
|
|
136
|
+
|
|
137
|
+
def convert_to_string(self) -> Message:
|
|
138
|
+
"""Convert input data to string with proper error handling."""
|
|
139
|
+
result = ""
|
|
140
|
+
if isinstance(self.input_data, list):
|
|
141
|
+
result = "\n".join([safe_convert(item, clean_data=self.clean_data or False) for item in self.input_data])
|
|
142
|
+
else:
|
|
143
|
+
result = safe_convert(self.input_data or False)
|
|
144
|
+
self.log(f"Converted to string with length: {len(result)}")
|
|
145
|
+
|
|
146
|
+
message = Message(text=result)
|
|
147
|
+
self.status = message
|
|
148
|
+
return message
|
|
@@ -0,0 +1,83 @@
|
|
|
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
|
+
replacement = ["processing.ParserComponent"]
|
|
15
|
+
|
|
16
|
+
inputs = [
|
|
17
|
+
MessageTextInput(
|
|
18
|
+
name="input_text",
|
|
19
|
+
display_name="Input Text",
|
|
20
|
+
info="The text to analyze",
|
|
21
|
+
required=True,
|
|
22
|
+
),
|
|
23
|
+
MessageTextInput(
|
|
24
|
+
name="pattern",
|
|
25
|
+
display_name="Regex Pattern",
|
|
26
|
+
info="The regular expression pattern to match",
|
|
27
|
+
value=r"",
|
|
28
|
+
required=True,
|
|
29
|
+
tool_mode=True,
|
|
30
|
+
),
|
|
31
|
+
]
|
|
32
|
+
|
|
33
|
+
outputs = [
|
|
34
|
+
Output(display_name="Data", name="data", method="extract_matches"),
|
|
35
|
+
Output(display_name="Message", name="text", method="get_matches_text"),
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
def extract_matches(self) -> list[Data]:
|
|
39
|
+
if not self.pattern or not self.input_text:
|
|
40
|
+
self.status = []
|
|
41
|
+
return []
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
# Compile regex pattern
|
|
45
|
+
pattern = re.compile(self.pattern)
|
|
46
|
+
|
|
47
|
+
# Find all matches in the input text
|
|
48
|
+
matches = pattern.findall(self.input_text)
|
|
49
|
+
|
|
50
|
+
# Filter out empty matches
|
|
51
|
+
filtered_matches = [match for match in matches if match] # Remove empty matches
|
|
52
|
+
|
|
53
|
+
# Return empty list for no matches, or list of matches if found
|
|
54
|
+
result: list = [] if not filtered_matches else [Data(data={"match": match}) for match in filtered_matches]
|
|
55
|
+
|
|
56
|
+
except re.error as e:
|
|
57
|
+
error_message = f"Invalid regex pattern: {e!s}"
|
|
58
|
+
result = [Data(data={"error": error_message})]
|
|
59
|
+
except ValueError as e:
|
|
60
|
+
error_message = f"Error extracting matches: {e!s}"
|
|
61
|
+
result = [Data(data={"error": error_message})]
|
|
62
|
+
|
|
63
|
+
self.status = result
|
|
64
|
+
return result
|
|
65
|
+
|
|
66
|
+
def get_matches_text(self) -> Message:
|
|
67
|
+
"""Get matches as a formatted text message."""
|
|
68
|
+
matches = self.extract_matches()
|
|
69
|
+
|
|
70
|
+
if not matches:
|
|
71
|
+
message = Message(text="No matches found")
|
|
72
|
+
self.status = message
|
|
73
|
+
return message
|
|
74
|
+
|
|
75
|
+
if "error" in matches[0].data:
|
|
76
|
+
message = Message(text=matches[0].data["error"])
|
|
77
|
+
self.status = message
|
|
78
|
+
return message
|
|
79
|
+
|
|
80
|
+
result = "\n".join(match.data["match"] for match in matches)
|
|
81
|
+
message = Message(text=result)
|
|
82
|
+
self.status = message
|
|
83
|
+
return message
|
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
replacement = ["processing.DataOperations"]
|
|
15
|
+
|
|
16
|
+
inputs = [
|
|
17
|
+
DataInput(
|
|
18
|
+
name="data_list",
|
|
19
|
+
display_name="Data List",
|
|
20
|
+
info="List of data to select from.",
|
|
21
|
+
is_list=True, # Specify that this input takes a list of Data objects
|
|
22
|
+
),
|
|
23
|
+
IntInput(
|
|
24
|
+
name="data_index",
|
|
25
|
+
display_name="Data Index",
|
|
26
|
+
info="Index of the data to select.",
|
|
27
|
+
value=0, # Will be populated dynamically based on the length of data_list
|
|
28
|
+
range_spec=RangeSpec(min=0, max=15, step=1, step_type="int"),
|
|
29
|
+
),
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
outputs = [
|
|
33
|
+
Output(display_name="Selected Data", name="selected_data", method="select_data"),
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
async def select_data(self) -> Data:
|
|
37
|
+
# Retrieve the selected index from the dropdown
|
|
38
|
+
selected_index = int(self.data_index)
|
|
39
|
+
# Get the data list
|
|
40
|
+
|
|
41
|
+
# Validate that the selected index is within bounds
|
|
42
|
+
if selected_index < 0 or selected_index >= len(self.data_list):
|
|
43
|
+
msg = f"Selected index {selected_index} is out of range."
|
|
44
|
+
raise ValueError(msg)
|
|
45
|
+
|
|
46
|
+
# Return the selected Data object
|
|
47
|
+
selected_data = self.data_list[selected_index]
|
|
48
|
+
self.status = selected_data # Update the component status to reflect the selected data
|
|
49
|
+
return selected_data
|