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,313 @@
|
|
1
|
+
import pandas as pd
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.inputs import SortableListInput
|
5
|
+
from lfx.io import BoolInput, DataFrameInput, DropdownInput, IntInput, MessageTextInput, Output, StrInput
|
6
|
+
from lfx.log.logger import logger
|
7
|
+
from lfx.schema.dataframe import DataFrame
|
8
|
+
|
9
|
+
|
10
|
+
class DataFrameOperationsComponent(Component):
|
11
|
+
display_name = "DataFrame Operations"
|
12
|
+
description = "Perform various operations on a DataFrame."
|
13
|
+
documentation: str = "https://docs.langflow.org/components-processing#dataframe-operations"
|
14
|
+
icon = "table"
|
15
|
+
name = "DataFrameOperations"
|
16
|
+
|
17
|
+
OPERATION_CHOICES = [
|
18
|
+
"Add Column",
|
19
|
+
"Drop Column",
|
20
|
+
"Filter",
|
21
|
+
"Head",
|
22
|
+
"Rename Column",
|
23
|
+
"Replace Value",
|
24
|
+
"Select Columns",
|
25
|
+
"Sort",
|
26
|
+
"Tail",
|
27
|
+
"Drop Duplicates",
|
28
|
+
]
|
29
|
+
|
30
|
+
inputs = [
|
31
|
+
DataFrameInput(
|
32
|
+
name="df",
|
33
|
+
display_name="DataFrame",
|
34
|
+
info="The input DataFrame to operate on.",
|
35
|
+
required=True,
|
36
|
+
),
|
37
|
+
SortableListInput(
|
38
|
+
name="operation",
|
39
|
+
display_name="Operation",
|
40
|
+
placeholder="Select Operation",
|
41
|
+
info="Select the DataFrame operation to perform.",
|
42
|
+
options=[
|
43
|
+
{"name": "Add Column", "icon": "plus"},
|
44
|
+
{"name": "Drop Column", "icon": "minus"},
|
45
|
+
{"name": "Filter", "icon": "filter"},
|
46
|
+
{"name": "Head", "icon": "arrow-up"},
|
47
|
+
{"name": "Rename Column", "icon": "pencil"},
|
48
|
+
{"name": "Replace Value", "icon": "replace"},
|
49
|
+
{"name": "Select Columns", "icon": "columns"},
|
50
|
+
{"name": "Sort", "icon": "arrow-up-down"},
|
51
|
+
{"name": "Tail", "icon": "arrow-down"},
|
52
|
+
{"name": "Drop Duplicates", "icon": "copy-x"},
|
53
|
+
],
|
54
|
+
real_time_refresh=True,
|
55
|
+
limit=1,
|
56
|
+
),
|
57
|
+
StrInput(
|
58
|
+
name="column_name",
|
59
|
+
display_name="Column Name",
|
60
|
+
info="The column name to use for the operation.",
|
61
|
+
dynamic=True,
|
62
|
+
show=False,
|
63
|
+
),
|
64
|
+
MessageTextInput(
|
65
|
+
name="filter_value",
|
66
|
+
display_name="Filter Value",
|
67
|
+
info="The value to filter rows by.",
|
68
|
+
dynamic=True,
|
69
|
+
show=False,
|
70
|
+
),
|
71
|
+
DropdownInput(
|
72
|
+
name="filter_operator",
|
73
|
+
display_name="Filter Operator",
|
74
|
+
options=[
|
75
|
+
"equals",
|
76
|
+
"not equals",
|
77
|
+
"contains",
|
78
|
+
"not contains",
|
79
|
+
"starts with",
|
80
|
+
"ends with",
|
81
|
+
"greater than",
|
82
|
+
"less than",
|
83
|
+
],
|
84
|
+
value="equals",
|
85
|
+
info="The operator to apply for filtering rows.",
|
86
|
+
advanced=False,
|
87
|
+
dynamic=True,
|
88
|
+
show=False,
|
89
|
+
),
|
90
|
+
BoolInput(
|
91
|
+
name="ascending",
|
92
|
+
display_name="Sort Ascending",
|
93
|
+
info="Whether to sort in ascending order.",
|
94
|
+
dynamic=True,
|
95
|
+
show=False,
|
96
|
+
value=True,
|
97
|
+
),
|
98
|
+
StrInput(
|
99
|
+
name="new_column_name",
|
100
|
+
display_name="New Column Name",
|
101
|
+
info="The new column name when renaming or adding a column.",
|
102
|
+
dynamic=True,
|
103
|
+
show=False,
|
104
|
+
),
|
105
|
+
MessageTextInput(
|
106
|
+
name="new_column_value",
|
107
|
+
display_name="New Column Value",
|
108
|
+
info="The value to populate the new column with.",
|
109
|
+
dynamic=True,
|
110
|
+
show=False,
|
111
|
+
),
|
112
|
+
StrInput(
|
113
|
+
name="columns_to_select",
|
114
|
+
display_name="Columns to Select",
|
115
|
+
dynamic=True,
|
116
|
+
is_list=True,
|
117
|
+
show=False,
|
118
|
+
),
|
119
|
+
IntInput(
|
120
|
+
name="num_rows",
|
121
|
+
display_name="Number of Rows",
|
122
|
+
info="Number of rows to return (for head/tail).",
|
123
|
+
dynamic=True,
|
124
|
+
show=False,
|
125
|
+
value=5,
|
126
|
+
),
|
127
|
+
MessageTextInput(
|
128
|
+
name="replace_value",
|
129
|
+
display_name="Value to Replace",
|
130
|
+
info="The value to replace in the column.",
|
131
|
+
dynamic=True,
|
132
|
+
show=False,
|
133
|
+
),
|
134
|
+
MessageTextInput(
|
135
|
+
name="replacement_value",
|
136
|
+
display_name="Replacement Value",
|
137
|
+
info="The value to replace with.",
|
138
|
+
dynamic=True,
|
139
|
+
show=False,
|
140
|
+
),
|
141
|
+
]
|
142
|
+
|
143
|
+
outputs = [
|
144
|
+
Output(
|
145
|
+
display_name="DataFrame",
|
146
|
+
name="output",
|
147
|
+
method="perform_operation",
|
148
|
+
info="The resulting DataFrame after the operation.",
|
149
|
+
)
|
150
|
+
]
|
151
|
+
|
152
|
+
def update_build_config(self, build_config, field_value, field_name=None):
|
153
|
+
dynamic_fields = [
|
154
|
+
"column_name",
|
155
|
+
"filter_value",
|
156
|
+
"filter_operator",
|
157
|
+
"ascending",
|
158
|
+
"new_column_name",
|
159
|
+
"new_column_value",
|
160
|
+
"columns_to_select",
|
161
|
+
"num_rows",
|
162
|
+
"replace_value",
|
163
|
+
"replacement_value",
|
164
|
+
]
|
165
|
+
for field in dynamic_fields:
|
166
|
+
build_config[field]["show"] = False
|
167
|
+
|
168
|
+
if field_name == "operation":
|
169
|
+
# Handle SortableListInput format
|
170
|
+
if isinstance(field_value, list):
|
171
|
+
operation_name = field_value[0].get("name", "") if field_value else ""
|
172
|
+
else:
|
173
|
+
operation_name = field_value or ""
|
174
|
+
|
175
|
+
# If no operation selected, all dynamic fields stay hidden (already set to False above)
|
176
|
+
if not operation_name:
|
177
|
+
return build_config
|
178
|
+
|
179
|
+
if operation_name == "Filter":
|
180
|
+
build_config["column_name"]["show"] = True
|
181
|
+
build_config["filter_value"]["show"] = True
|
182
|
+
build_config["filter_operator"]["show"] = True
|
183
|
+
elif operation_name == "Sort":
|
184
|
+
build_config["column_name"]["show"] = True
|
185
|
+
build_config["ascending"]["show"] = True
|
186
|
+
elif operation_name == "Drop Column":
|
187
|
+
build_config["column_name"]["show"] = True
|
188
|
+
elif operation_name == "Rename Column":
|
189
|
+
build_config["column_name"]["show"] = True
|
190
|
+
build_config["new_column_name"]["show"] = True
|
191
|
+
elif operation_name == "Add Column":
|
192
|
+
build_config["new_column_name"]["show"] = True
|
193
|
+
build_config["new_column_value"]["show"] = True
|
194
|
+
elif operation_name == "Select Columns":
|
195
|
+
build_config["columns_to_select"]["show"] = True
|
196
|
+
elif operation_name in {"Head", "Tail"}:
|
197
|
+
build_config["num_rows"]["show"] = True
|
198
|
+
elif operation_name == "Replace Value":
|
199
|
+
build_config["column_name"]["show"] = True
|
200
|
+
build_config["replace_value"]["show"] = True
|
201
|
+
build_config["replacement_value"]["show"] = True
|
202
|
+
elif operation_name == "Drop Duplicates":
|
203
|
+
build_config["column_name"]["show"] = True
|
204
|
+
|
205
|
+
return build_config
|
206
|
+
|
207
|
+
def perform_operation(self) -> DataFrame:
|
208
|
+
df_copy = self.df.copy()
|
209
|
+
|
210
|
+
# Handle SortableListInput format for operation
|
211
|
+
operation_input = getattr(self, "operation", [])
|
212
|
+
if isinstance(operation_input, list) and len(operation_input) > 0:
|
213
|
+
op = operation_input[0].get("name", "")
|
214
|
+
else:
|
215
|
+
op = ""
|
216
|
+
|
217
|
+
# If no operation selected, return original DataFrame
|
218
|
+
if not op:
|
219
|
+
return df_copy
|
220
|
+
|
221
|
+
if op == "Filter":
|
222
|
+
return self.filter_rows_by_value(df_copy)
|
223
|
+
if op == "Sort":
|
224
|
+
return self.sort_by_column(df_copy)
|
225
|
+
if op == "Drop Column":
|
226
|
+
return self.drop_column(df_copy)
|
227
|
+
if op == "Rename Column":
|
228
|
+
return self.rename_column(df_copy)
|
229
|
+
if op == "Add Column":
|
230
|
+
return self.add_column(df_copy)
|
231
|
+
if op == "Select Columns":
|
232
|
+
return self.select_columns(df_copy)
|
233
|
+
if op == "Head":
|
234
|
+
return self.head(df_copy)
|
235
|
+
if op == "Tail":
|
236
|
+
return self.tail(df_copy)
|
237
|
+
if op == "Replace Value":
|
238
|
+
return self.replace_values(df_copy)
|
239
|
+
if op == "Drop Duplicates":
|
240
|
+
return self.drop_duplicates(df_copy)
|
241
|
+
msg = f"Unsupported operation: {op}"
|
242
|
+
logger.error(msg)
|
243
|
+
raise ValueError(msg)
|
244
|
+
|
245
|
+
def filter_rows_by_value(self, df: DataFrame) -> DataFrame:
|
246
|
+
column = df[self.column_name]
|
247
|
+
filter_value = self.filter_value
|
248
|
+
|
249
|
+
# Handle regular DropdownInput format (just a string value)
|
250
|
+
operator = getattr(self, "filter_operator", "equals") # Default to equals for backward compatibility
|
251
|
+
|
252
|
+
if operator == "equals":
|
253
|
+
mask = column == filter_value
|
254
|
+
elif operator == "not equals":
|
255
|
+
mask = column != filter_value
|
256
|
+
elif operator == "contains":
|
257
|
+
mask = column.astype(str).str.contains(str(filter_value), na=False)
|
258
|
+
elif operator == "not contains":
|
259
|
+
mask = ~column.astype(str).str.contains(str(filter_value), na=False)
|
260
|
+
elif operator == "starts with":
|
261
|
+
mask = column.astype(str).str.startswith(str(filter_value), na=False)
|
262
|
+
elif operator == "ends with":
|
263
|
+
mask = column.astype(str).str.endswith(str(filter_value), na=False)
|
264
|
+
elif operator == "greater than":
|
265
|
+
try:
|
266
|
+
# Try to convert filter_value to numeric for comparison
|
267
|
+
numeric_value = pd.to_numeric(filter_value)
|
268
|
+
mask = column > numeric_value
|
269
|
+
except (ValueError, TypeError):
|
270
|
+
# If conversion fails, compare as strings
|
271
|
+
mask = column.astype(str) > str(filter_value)
|
272
|
+
elif operator == "less than":
|
273
|
+
try:
|
274
|
+
# Try to convert filter_value to numeric for comparison
|
275
|
+
numeric_value = pd.to_numeric(filter_value)
|
276
|
+
mask = column < numeric_value
|
277
|
+
except (ValueError, TypeError):
|
278
|
+
# If conversion fails, compare as strings
|
279
|
+
mask = column.astype(str) < str(filter_value)
|
280
|
+
else:
|
281
|
+
mask = column == filter_value # Fallback to equals
|
282
|
+
|
283
|
+
return DataFrame(df[mask])
|
284
|
+
|
285
|
+
def sort_by_column(self, df: DataFrame) -> DataFrame:
|
286
|
+
return DataFrame(df.sort_values(by=self.column_name, ascending=self.ascending))
|
287
|
+
|
288
|
+
def drop_column(self, df: DataFrame) -> DataFrame:
|
289
|
+
return DataFrame(df.drop(columns=[self.column_name]))
|
290
|
+
|
291
|
+
def rename_column(self, df: DataFrame) -> DataFrame:
|
292
|
+
return DataFrame(df.rename(columns={self.column_name: self.new_column_name}))
|
293
|
+
|
294
|
+
def add_column(self, df: DataFrame) -> DataFrame:
|
295
|
+
df[self.new_column_name] = [self.new_column_value] * len(df)
|
296
|
+
return DataFrame(df)
|
297
|
+
|
298
|
+
def select_columns(self, df: DataFrame) -> DataFrame:
|
299
|
+
columns = [col.strip() for col in self.columns_to_select]
|
300
|
+
return DataFrame(df[columns])
|
301
|
+
|
302
|
+
def head(self, df: DataFrame) -> DataFrame:
|
303
|
+
return DataFrame(df.head(self.num_rows))
|
304
|
+
|
305
|
+
def tail(self, df: DataFrame) -> DataFrame:
|
306
|
+
return DataFrame(df.tail(self.num_rows))
|
307
|
+
|
308
|
+
def replace_values(self, df: DataFrame) -> DataFrame:
|
309
|
+
df[self.column_name] = df[self.column_name].replace(self.replace_value, self.replacement_value)
|
310
|
+
return DataFrame(df)
|
311
|
+
|
312
|
+
def drop_duplicates(self, df: DataFrame) -> DataFrame:
|
313
|
+
return DataFrame(df.drop_duplicates(subset=self.column_name))
|
@@ -0,0 +1,53 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.io import DataInput, Output, StrInput
|
3
|
+
from lfx.schema.data import Data
|
4
|
+
|
5
|
+
|
6
|
+
class ExtractDataKeyComponent(Component):
|
7
|
+
display_name = "Extract Key"
|
8
|
+
description = (
|
9
|
+
"Extract a specific key from a Data object or a list of "
|
10
|
+
"Data objects and return the extracted value(s) as Data object(s)."
|
11
|
+
)
|
12
|
+
icon = "key"
|
13
|
+
name = "ExtractaKey"
|
14
|
+
legacy = True
|
15
|
+
|
16
|
+
inputs = [
|
17
|
+
DataInput(
|
18
|
+
name="data_input",
|
19
|
+
display_name="Data Input",
|
20
|
+
info="The Data object or list of Data objects to extract the key from.",
|
21
|
+
),
|
22
|
+
StrInput(
|
23
|
+
name="key",
|
24
|
+
display_name="Key to Extract",
|
25
|
+
info="The key in the Data object(s) to extract.",
|
26
|
+
),
|
27
|
+
]
|
28
|
+
|
29
|
+
outputs = [
|
30
|
+
Output(display_name="Extracted Data", name="extracted_data", method="extract_key"),
|
31
|
+
]
|
32
|
+
|
33
|
+
def extract_key(self) -> Data | list[Data]:
|
34
|
+
key = self.key
|
35
|
+
|
36
|
+
if isinstance(self.data_input, list):
|
37
|
+
result = []
|
38
|
+
for item in self.data_input:
|
39
|
+
if isinstance(item, Data) and key in item.data:
|
40
|
+
extracted_value = item.data[key]
|
41
|
+
result.append(Data(data={key: extracted_value}))
|
42
|
+
self.status = result
|
43
|
+
return result
|
44
|
+
if isinstance(self.data_input, Data):
|
45
|
+
if key in self.data_input.data:
|
46
|
+
extracted_value = self.data_input.data[key]
|
47
|
+
result = Data(data={key: extracted_value})
|
48
|
+
self.status = result
|
49
|
+
return result
|
50
|
+
self.status = f"Key '{key}' not found in Data object."
|
51
|
+
return Data(data={"error": f"Key '{key}' not found in Data object."})
|
52
|
+
self.status = "Invalid input. Expected Data object or list of Data objects."
|
53
|
+
return Data(data={"error": "Invalid input. Expected Data object or list of Data objects."})
|
@@ -0,0 +1,42 @@
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
2
|
+
from lfx.io import DataInput, MessageTextInput, Output
|
3
|
+
from lfx.schema.data import Data
|
4
|
+
|
5
|
+
|
6
|
+
class FilterDataComponent(Component):
|
7
|
+
display_name = "Filter Data"
|
8
|
+
description = "Filters a Data object based on a list of keys."
|
9
|
+
icon = "filter"
|
10
|
+
beta = True
|
11
|
+
name = "FilterData"
|
12
|
+
legacy = True
|
13
|
+
|
14
|
+
inputs = [
|
15
|
+
DataInput(
|
16
|
+
name="data",
|
17
|
+
display_name="Data",
|
18
|
+
info="Data object to filter.",
|
19
|
+
),
|
20
|
+
MessageTextInput(
|
21
|
+
name="filter_criteria",
|
22
|
+
display_name="Filter Criteria",
|
23
|
+
info="List of keys to filter by.",
|
24
|
+
is_list=True,
|
25
|
+
),
|
26
|
+
]
|
27
|
+
|
28
|
+
outputs = [
|
29
|
+
Output(display_name="Filtered Data", name="filtered_data", method="filter_data"),
|
30
|
+
]
|
31
|
+
|
32
|
+
def filter_data(self) -> Data:
|
33
|
+
filter_criteria: list[str] = self.filter_criteria
|
34
|
+
data = self.data.data if isinstance(self.data, Data) else {}
|
35
|
+
|
36
|
+
# Filter the data
|
37
|
+
filtered = {key: value for key, value in data.items() if key in filter_criteria}
|
38
|
+
|
39
|
+
# Create a new Data object with the filtered data
|
40
|
+
filtered_data = Data(data=filtered)
|
41
|
+
self.status = filtered_data
|
42
|
+
return filtered_data
|
@@ -0,0 +1,88 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
from lfx.custom.custom_component.component import Component
|
4
|
+
from lfx.io import DataInput, DropdownInput, MessageTextInput, Output
|
5
|
+
from lfx.schema.data import Data
|
6
|
+
|
7
|
+
|
8
|
+
class DataFilterComponent(Component):
|
9
|
+
display_name = "Filter Values"
|
10
|
+
description = (
|
11
|
+
"Filter a list of data items based on a specified key, filter value,"
|
12
|
+
" and comparison operator. Check advanced options to select match comparision."
|
13
|
+
)
|
14
|
+
icon = "filter"
|
15
|
+
beta = True
|
16
|
+
name = "FilterDataValues"
|
17
|
+
legacy = True
|
18
|
+
|
19
|
+
inputs = [
|
20
|
+
DataInput(name="input_data", display_name="Input Data", info="The list of data items to filter.", is_list=True),
|
21
|
+
MessageTextInput(
|
22
|
+
name="filter_key",
|
23
|
+
display_name="Filter Key",
|
24
|
+
info="The key to filter on (e.g., 'route').",
|
25
|
+
value="route",
|
26
|
+
input_types=["Data"],
|
27
|
+
),
|
28
|
+
MessageTextInput(
|
29
|
+
name="filter_value",
|
30
|
+
display_name="Filter Value",
|
31
|
+
info="The value to filter by (e.g., 'CMIP').",
|
32
|
+
value="CMIP",
|
33
|
+
input_types=["Data"],
|
34
|
+
),
|
35
|
+
DropdownInput(
|
36
|
+
name="operator",
|
37
|
+
display_name="Comparison Operator",
|
38
|
+
options=["equals", "not equals", "contains", "starts with", "ends with"],
|
39
|
+
info="The operator to apply for comparing the values.",
|
40
|
+
value="equals",
|
41
|
+
advanced=True,
|
42
|
+
),
|
43
|
+
]
|
44
|
+
|
45
|
+
outputs = [
|
46
|
+
Output(display_name="Filtered Data", name="filtered_data", method="filter_data"),
|
47
|
+
]
|
48
|
+
|
49
|
+
def compare_values(self, item_value: Any, filter_value: str, operator: str) -> bool:
|
50
|
+
if operator == "equals":
|
51
|
+
return str(item_value) == filter_value
|
52
|
+
if operator == "not equals":
|
53
|
+
return str(item_value) != filter_value
|
54
|
+
if operator == "contains":
|
55
|
+
return filter_value in str(item_value)
|
56
|
+
if operator == "starts with":
|
57
|
+
return str(item_value).startswith(filter_value)
|
58
|
+
if operator == "ends with":
|
59
|
+
return str(item_value).endswith(filter_value)
|
60
|
+
return False
|
61
|
+
|
62
|
+
def filter_data(self) -> list[Data]:
|
63
|
+
# Extract inputs
|
64
|
+
input_data: list[Data] = self.input_data
|
65
|
+
filter_key: str = self.filter_key.text
|
66
|
+
filter_value: str = self.filter_value.text
|
67
|
+
operator: str = self.operator
|
68
|
+
|
69
|
+
# Validate inputs
|
70
|
+
if not input_data:
|
71
|
+
self.status = "Input data is empty."
|
72
|
+
return []
|
73
|
+
|
74
|
+
if not filter_key or not filter_value:
|
75
|
+
self.status = "Filter key or value is missing."
|
76
|
+
return input_data
|
77
|
+
|
78
|
+
# Filter the data
|
79
|
+
filtered_data = []
|
80
|
+
for item in input_data:
|
81
|
+
if isinstance(item.data, dict) and filter_key in item.data:
|
82
|
+
if self.compare_values(item.data[filter_key], filter_value, operator):
|
83
|
+
filtered_data.append(item)
|
84
|
+
else:
|
85
|
+
self.status = f"Warning: Some items don't have the key '{filter_key}' or are not dictionaries."
|
86
|
+
|
87
|
+
self.status = filtered_data
|
88
|
+
return filtered_data
|
@@ -0,0 +1,103 @@
|
|
1
|
+
import json
|
2
|
+
import unicodedata
|
3
|
+
|
4
|
+
from lfx.custom.custom_component.component import Component
|
5
|
+
from lfx.inputs.inputs import BoolInput, MessageTextInput
|
6
|
+
from lfx.schema.message import Message
|
7
|
+
from lfx.template.field.base import Output
|
8
|
+
|
9
|
+
|
10
|
+
class JSONCleaner(Component):
|
11
|
+
icon = "braces"
|
12
|
+
display_name = "JSON Cleaner"
|
13
|
+
description = (
|
14
|
+
"Cleans the messy and sometimes incorrect JSON strings produced by LLMs "
|
15
|
+
"so that they are fully compliant with the JSON spec."
|
16
|
+
)
|
17
|
+
legacy = True
|
18
|
+
inputs = [
|
19
|
+
MessageTextInput(
|
20
|
+
name="json_str", display_name="JSON String", info="The JSON string to be cleaned.", required=True
|
21
|
+
),
|
22
|
+
BoolInput(
|
23
|
+
name="remove_control_chars",
|
24
|
+
display_name="Remove Control Characters",
|
25
|
+
info="Remove control characters from the JSON string.",
|
26
|
+
required=False,
|
27
|
+
),
|
28
|
+
BoolInput(
|
29
|
+
name="normalize_unicode",
|
30
|
+
display_name="Normalize Unicode",
|
31
|
+
info="Normalize Unicode characters in the JSON string.",
|
32
|
+
required=False,
|
33
|
+
),
|
34
|
+
BoolInput(
|
35
|
+
name="validate_json",
|
36
|
+
display_name="Validate JSON",
|
37
|
+
info="Validate the JSON string to ensure it is well-formed.",
|
38
|
+
required=False,
|
39
|
+
),
|
40
|
+
]
|
41
|
+
|
42
|
+
outputs = [
|
43
|
+
Output(display_name="Cleaned JSON String", name="output", method="clean_json"),
|
44
|
+
]
|
45
|
+
|
46
|
+
def clean_json(self) -> Message:
|
47
|
+
try:
|
48
|
+
from json_repair import repair_json
|
49
|
+
except ImportError as e:
|
50
|
+
msg = "Could not import the json_repair package. Please install it with `pip install json_repair`."
|
51
|
+
raise ImportError(msg) from e
|
52
|
+
|
53
|
+
"""Clean the input JSON string based on provided options and return the cleaned JSON string."""
|
54
|
+
json_str = self.json_str
|
55
|
+
remove_control_chars = self.remove_control_chars
|
56
|
+
normalize_unicode = self.normalize_unicode
|
57
|
+
validate_json = self.validate_json
|
58
|
+
|
59
|
+
start = json_str.find("{")
|
60
|
+
end = json_str.rfind("}")
|
61
|
+
if start == -1 or end == -1:
|
62
|
+
msg = "Invalid JSON string: Missing '{' or '}'"
|
63
|
+
raise ValueError(msg)
|
64
|
+
try:
|
65
|
+
json_str = json_str[start : end + 1]
|
66
|
+
|
67
|
+
if remove_control_chars:
|
68
|
+
json_str = self._remove_control_characters(json_str)
|
69
|
+
if normalize_unicode:
|
70
|
+
json_str = self._normalize_unicode(json_str)
|
71
|
+
if validate_json:
|
72
|
+
json_str = self._validate_json(json_str)
|
73
|
+
|
74
|
+
cleaned_json_str = repair_json(json_str)
|
75
|
+
result = str(cleaned_json_str)
|
76
|
+
|
77
|
+
self.status = result
|
78
|
+
return Message(text=result)
|
79
|
+
except Exception as e:
|
80
|
+
msg = f"Error cleaning JSON string: {e}"
|
81
|
+
raise ValueError(msg) from e
|
82
|
+
|
83
|
+
def _remove_control_characters(self, s: str) -> str:
|
84
|
+
"""Remove control characters from the string."""
|
85
|
+
return s.translate(self.translation_table)
|
86
|
+
|
87
|
+
def _normalize_unicode(self, s: str) -> str:
|
88
|
+
"""Normalize Unicode characters in the string."""
|
89
|
+
return unicodedata.normalize("NFC", s)
|
90
|
+
|
91
|
+
def _validate_json(self, s: str) -> str:
|
92
|
+
"""Validate the JSON string."""
|
93
|
+
try:
|
94
|
+
json.loads(s)
|
95
|
+
except json.JSONDecodeError as e:
|
96
|
+
msg = f"Invalid JSON string: {e}"
|
97
|
+
raise ValueError(msg) from e
|
98
|
+
return s
|
99
|
+
|
100
|
+
def __init__(self, *args, **kwargs):
|
101
|
+
# Create a translation table that maps control characters to None
|
102
|
+
super().__init__(*args, **kwargs)
|
103
|
+
self.translation_table = str.maketrans("", "", "".join(chr(i) for i in range(32)) + chr(127))
|