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,90 @@
|
|
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
|
+
|
24
|
+
inputs = [
|
25
|
+
DataInput(name="data_inputs", display_name="Data Inputs", info="Data to combine", is_list=True, required=True),
|
26
|
+
DropdownInput(
|
27
|
+
name="operation",
|
28
|
+
display_name="Operation Type",
|
29
|
+
options=[op.value for op in DataOperation],
|
30
|
+
value=DataOperation.CONCATENATE.value,
|
31
|
+
),
|
32
|
+
]
|
33
|
+
outputs = [Output(display_name="DataFrame", name="combined_data", method="combine_data")]
|
34
|
+
|
35
|
+
def combine_data(self) -> DataFrame:
|
36
|
+
if not self.data_inputs or len(self.data_inputs) < self.MIN_INPUTS_REQUIRED:
|
37
|
+
empty_dataframe = DataFrame()
|
38
|
+
self.status = empty_dataframe
|
39
|
+
return empty_dataframe
|
40
|
+
|
41
|
+
operation = DataOperation(self.operation)
|
42
|
+
try:
|
43
|
+
combined_dataframe = self._process_operation(operation)
|
44
|
+
self.status = combined_dataframe
|
45
|
+
except Exception as e:
|
46
|
+
logger.error(f"Error during operation {operation}: {e!s}")
|
47
|
+
raise
|
48
|
+
else:
|
49
|
+
return combined_dataframe
|
50
|
+
|
51
|
+
def _process_operation(self, operation: DataOperation) -> DataFrame:
|
52
|
+
if operation == DataOperation.CONCATENATE:
|
53
|
+
combined_data: dict[str, str | object] = {}
|
54
|
+
for data_input in self.data_inputs:
|
55
|
+
for key, value in data_input.data.items():
|
56
|
+
if key in combined_data:
|
57
|
+
if isinstance(combined_data[key], str) and isinstance(value, str):
|
58
|
+
combined_data[key] = f"{combined_data[key]}\n{value}"
|
59
|
+
else:
|
60
|
+
combined_data[key] = value
|
61
|
+
else:
|
62
|
+
combined_data[key] = value
|
63
|
+
return DataFrame([combined_data])
|
64
|
+
|
65
|
+
if operation == DataOperation.APPEND:
|
66
|
+
rows = [data_input.data for data_input in self.data_inputs]
|
67
|
+
return DataFrame(rows)
|
68
|
+
|
69
|
+
if operation == DataOperation.MERGE:
|
70
|
+
result_data: dict[str, str | list[str] | object] = {}
|
71
|
+
for data_input in self.data_inputs:
|
72
|
+
for key, value in data_input.data.items():
|
73
|
+
if key in result_data and isinstance(value, str):
|
74
|
+
if isinstance(result_data[key], list):
|
75
|
+
cast("list[str]", result_data[key]).append(value)
|
76
|
+
else:
|
77
|
+
result_data[key] = [result_data[key], value]
|
78
|
+
else:
|
79
|
+
result_data[key] = value
|
80
|
+
return DataFrame([result_data])
|
81
|
+
|
82
|
+
if operation == DataOperation.JOIN:
|
83
|
+
combined_data = {}
|
84
|
+
for idx, data_input in enumerate(self.data_inputs, 1):
|
85
|
+
for key, value in data_input.data.items():
|
86
|
+
new_key = f"{key}_doc{idx}" if idx > 1 else key
|
87
|
+
combined_data[new_key] = value
|
88
|
+
return DataFrame([combined_data])
|
89
|
+
|
90
|
+
return DataFrame()
|
@@ -0,0 +1,36 @@
|
|
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
|
+
|
15
|
+
inputs = [
|
16
|
+
MessageInput(
|
17
|
+
name="message",
|
18
|
+
display_name="Message",
|
19
|
+
info="The Message object to convert to a Data object",
|
20
|
+
),
|
21
|
+
]
|
22
|
+
|
23
|
+
outputs = [
|
24
|
+
Output(display_name="Data", name="data", method="convert_message_to_data"),
|
25
|
+
]
|
26
|
+
|
27
|
+
def convert_message_to_data(self) -> Data:
|
28
|
+
# Check for Message by checking if it has the expected attributes instead of isinstance
|
29
|
+
if hasattr(self.message, "data") and hasattr(self.message, "text") and hasattr(self.message, "get_text"):
|
30
|
+
# Convert Message to Data - this works for both langflow.Message and lfx.Message
|
31
|
+
return Data(data=self.message.data)
|
32
|
+
|
33
|
+
msg = "Error converting Message to Data: Input must be a Message object"
|
34
|
+
logger.debug(msg, exc_info=True)
|
35
|
+
self.status = msg
|
36
|
+
return Data(data={"error": msg})
|
@@ -0,0 +1,70 @@
|
|
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
|
+
metadata = {
|
15
|
+
"legacy_name": "Parse Data",
|
16
|
+
}
|
17
|
+
|
18
|
+
inputs = [
|
19
|
+
DataInput(
|
20
|
+
name="data",
|
21
|
+
display_name="Data",
|
22
|
+
info="The data to convert to text.",
|
23
|
+
is_list=True,
|
24
|
+
required=True,
|
25
|
+
),
|
26
|
+
MultilineInput(
|
27
|
+
name="template",
|
28
|
+
display_name="Template",
|
29
|
+
info="The template to use for formatting the data. "
|
30
|
+
"It can contain the keys {text}, {data} or any other key in the Data.",
|
31
|
+
value="{text}",
|
32
|
+
required=True,
|
33
|
+
),
|
34
|
+
StrInput(name="sep", display_name="Separator", advanced=True, value="\n"),
|
35
|
+
]
|
36
|
+
|
37
|
+
outputs = [
|
38
|
+
Output(
|
39
|
+
display_name="Message",
|
40
|
+
name="text",
|
41
|
+
info="Data as a single Message, with each input Data separated by Separator",
|
42
|
+
method="parse_data",
|
43
|
+
),
|
44
|
+
Output(
|
45
|
+
display_name="Data List",
|
46
|
+
name="data_list",
|
47
|
+
info="Data as a list of new Data, each having `text` formatted by Template",
|
48
|
+
method="parse_data_as_list",
|
49
|
+
),
|
50
|
+
]
|
51
|
+
|
52
|
+
def _clean_args(self) -> tuple[list[Data], str, str]:
|
53
|
+
data = self.data if isinstance(self.data, list) else [self.data]
|
54
|
+
template = self.template
|
55
|
+
sep = self.sep
|
56
|
+
return data, template, sep
|
57
|
+
|
58
|
+
def parse_data(self) -> Message:
|
59
|
+
data, template, sep = self._clean_args()
|
60
|
+
result_string = data_to_text(template, data, sep)
|
61
|
+
self.status = result_string
|
62
|
+
return Message(text=result_string)
|
63
|
+
|
64
|
+
def parse_data_as_list(self) -> list[Data]:
|
65
|
+
data, template, _ = self._clean_args()
|
66
|
+
text_list, data_list = data_to_text_list(template, data)
|
67
|
+
for item, text in zip(data_list, text_list, strict=True):
|
68
|
+
item.set_text(text)
|
69
|
+
self.status = data_list
|
70
|
+
return data_list
|
@@ -0,0 +1,68 @@
|
|
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
|
+
|
16
|
+
inputs = [
|
17
|
+
DataFrameInput(name="df", display_name="DataFrame", info="The DataFrame to convert to text rows."),
|
18
|
+
MultilineInput(
|
19
|
+
name="template",
|
20
|
+
display_name="Template",
|
21
|
+
info=(
|
22
|
+
"The template for formatting each row. "
|
23
|
+
"Use placeholders matching column names in the DataFrame, for example '{col1}', '{col2}'."
|
24
|
+
),
|
25
|
+
value="{text}",
|
26
|
+
),
|
27
|
+
StrInput(
|
28
|
+
name="sep",
|
29
|
+
display_name="Separator",
|
30
|
+
advanced=True,
|
31
|
+
value="\n",
|
32
|
+
info="String that joins all row texts when building the single Text output.",
|
33
|
+
),
|
34
|
+
]
|
35
|
+
|
36
|
+
outputs = [
|
37
|
+
Output(
|
38
|
+
display_name="Text",
|
39
|
+
name="text",
|
40
|
+
info="All rows combined into a single text, each row formatted by the template and separated by `sep`.",
|
41
|
+
method="parse_data",
|
42
|
+
),
|
43
|
+
]
|
44
|
+
|
45
|
+
def _clean_args(self):
|
46
|
+
dataframe = self.df
|
47
|
+
template = self.template or "{text}"
|
48
|
+
sep = self.sep or "\n"
|
49
|
+
return dataframe, template, sep
|
50
|
+
|
51
|
+
def parse_data(self) -> Message:
|
52
|
+
"""Converts each row of the DataFrame into a formatted string using the template.
|
53
|
+
|
54
|
+
then joins them with `sep`. Returns a single combined string as a Message.
|
55
|
+
"""
|
56
|
+
dataframe, template, sep = self._clean_args()
|
57
|
+
|
58
|
+
lines = []
|
59
|
+
# For each row in the DataFrame, build a dict and format
|
60
|
+
for _, row in dataframe.iterrows():
|
61
|
+
row_dict = row.to_dict()
|
62
|
+
text_line = template.format(**row_dict) # e.g. template="{text}", row_dict={"text": "Hello"}
|
63
|
+
lines.append(text_line)
|
64
|
+
|
65
|
+
# Join all lines with the provided separator
|
66
|
+
result_string = sep.join(lines)
|
67
|
+
self.status = result_string # store in self.status for UI logs
|
68
|
+
return Message(text=result_string)
|
@@ -0,0 +1,90 @@
|
|
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
|
+
|
22
|
+
inputs = [
|
23
|
+
HandleInput(
|
24
|
+
name="input_value",
|
25
|
+
display_name="Input",
|
26
|
+
info="Data object to filter.",
|
27
|
+
required=True,
|
28
|
+
input_types=["Message", "Data"],
|
29
|
+
),
|
30
|
+
MessageTextInput(
|
31
|
+
name="query",
|
32
|
+
display_name="JQ Query",
|
33
|
+
info="JQ Query to filter the data. The input is always a JSON list.",
|
34
|
+
required=True,
|
35
|
+
),
|
36
|
+
]
|
37
|
+
|
38
|
+
outputs = [
|
39
|
+
Output(display_name="Filtered Data", name="filtered_data", method="filter_data"),
|
40
|
+
]
|
41
|
+
|
42
|
+
def _parse_data(self, input_value) -> str:
|
43
|
+
if isinstance(input_value, Message) and isinstance(input_value.text, str):
|
44
|
+
return input_value.text
|
45
|
+
if isinstance(input_value, Data):
|
46
|
+
return json.dumps(input_value.data)
|
47
|
+
return str(input_value)
|
48
|
+
|
49
|
+
def filter_data(self) -> list[Data]:
|
50
|
+
to_filter = self.input_value
|
51
|
+
if not to_filter:
|
52
|
+
return []
|
53
|
+
# Check if input is a list
|
54
|
+
if isinstance(to_filter, list):
|
55
|
+
to_filter = [self._parse_data(f) for f in to_filter]
|
56
|
+
else:
|
57
|
+
to_filter = self._parse_data(to_filter)
|
58
|
+
|
59
|
+
# If input is not a list, don't wrap it in a list
|
60
|
+
if not isinstance(to_filter, list):
|
61
|
+
to_filter = repair_json(to_filter)
|
62
|
+
try:
|
63
|
+
to_filter_as_dict = json.loads(to_filter)
|
64
|
+
except JSONDecodeError:
|
65
|
+
try:
|
66
|
+
to_filter_as_dict = json.loads(repair_json(to_filter))
|
67
|
+
except JSONDecodeError as e:
|
68
|
+
msg = f"Invalid JSON: {e}"
|
69
|
+
raise ValueError(msg) from e
|
70
|
+
else:
|
71
|
+
to_filter = [repair_json(f) for f in to_filter]
|
72
|
+
to_filter_as_dict = []
|
73
|
+
for f in to_filter:
|
74
|
+
try:
|
75
|
+
to_filter_as_dict.append(json.loads(f))
|
76
|
+
except JSONDecodeError:
|
77
|
+
try:
|
78
|
+
to_filter_as_dict.append(json.loads(repair_json(f)))
|
79
|
+
except JSONDecodeError as e:
|
80
|
+
msg = f"Invalid JSON: {e}"
|
81
|
+
raise ValueError(msg) from e
|
82
|
+
to_filter = to_filter_as_dict
|
83
|
+
|
84
|
+
full_filter_str = json.dumps(to_filter_as_dict)
|
85
|
+
|
86
|
+
logger.info("to_filter: ", to_filter)
|
87
|
+
|
88
|
+
results = jq.compile(self.query).input_text(full_filter_str).all()
|
89
|
+
logger.info("results: ", results)
|
90
|
+
return [Data(data=value) if isinstance(value, dict) else Data(text=str(value)) for value in results]
|
@@ -0,0 +1,143 @@
|
|
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/components-processing#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
|
+
formatted_text = self.pattern.format(**data.data)
|
126
|
+
lines.append(formatted_text)
|
127
|
+
|
128
|
+
combined_text = self.sep.join(lines)
|
129
|
+
self.status = combined_text
|
130
|
+
return Message(text=combined_text)
|
131
|
+
|
132
|
+
def convert_to_string(self) -> Message:
|
133
|
+
"""Convert input data to string with proper error handling."""
|
134
|
+
result = ""
|
135
|
+
if isinstance(self.input_data, list):
|
136
|
+
result = "\n".join([safe_convert(item, clean_data=self.clean_data or False) for item in self.input_data])
|
137
|
+
else:
|
138
|
+
result = safe_convert(self.input_data or False)
|
139
|
+
self.log(f"Converted to string with length: {len(result)}")
|
140
|
+
|
141
|
+
message = Message(text=result)
|
142
|
+
self.status = message
|
143
|
+
return message
|
@@ -0,0 +1,67 @@
|
|
1
|
+
from lfx.base.prompts.api_utils import process_prompt_template
|
2
|
+
from lfx.custom.custom_component.component import Component
|
3
|
+
from lfx.inputs.inputs import DefaultPromptField
|
4
|
+
from lfx.io import MessageTextInput, Output, PromptInput
|
5
|
+
from lfx.schema.message import Message
|
6
|
+
from lfx.template.utils import update_template_values
|
7
|
+
|
8
|
+
|
9
|
+
class PromptComponent(Component):
|
10
|
+
display_name: str = "Prompt Template"
|
11
|
+
description: str = "Create a prompt template with dynamic variables."
|
12
|
+
documentation: str = "https://docs.langflow.org/components-prompts"
|
13
|
+
icon = "braces"
|
14
|
+
trace_type = "prompt"
|
15
|
+
name = "Prompt Template"
|
16
|
+
priority = 0 # Set priority to 0 to make it appear first
|
17
|
+
|
18
|
+
inputs = [
|
19
|
+
PromptInput(name="template", display_name="Template"),
|
20
|
+
MessageTextInput(
|
21
|
+
name="tool_placeholder",
|
22
|
+
display_name="Tool Placeholder",
|
23
|
+
tool_mode=True,
|
24
|
+
advanced=True,
|
25
|
+
info="A placeholder input for tool mode.",
|
26
|
+
),
|
27
|
+
]
|
28
|
+
|
29
|
+
outputs = [
|
30
|
+
Output(display_name="Prompt", name="prompt", method="build_prompt"),
|
31
|
+
]
|
32
|
+
|
33
|
+
async def build_prompt(self) -> Message:
|
34
|
+
prompt = Message.from_template(**self._attributes)
|
35
|
+
self.status = prompt.text
|
36
|
+
return prompt
|
37
|
+
|
38
|
+
def _update_template(self, frontend_node: dict):
|
39
|
+
prompt_template = frontend_node["template"]["template"]["value"]
|
40
|
+
custom_fields = frontend_node["custom_fields"]
|
41
|
+
frontend_node_template = frontend_node["template"]
|
42
|
+
_ = process_prompt_template(
|
43
|
+
template=prompt_template,
|
44
|
+
name="template",
|
45
|
+
custom_fields=custom_fields,
|
46
|
+
frontend_node_template=frontend_node_template,
|
47
|
+
)
|
48
|
+
return frontend_node
|
49
|
+
|
50
|
+
async def update_frontend_node(self, new_frontend_node: dict, current_frontend_node: dict):
|
51
|
+
"""This function is called after the code validation is done."""
|
52
|
+
frontend_node = await super().update_frontend_node(new_frontend_node, current_frontend_node)
|
53
|
+
template = frontend_node["template"]["template"]["value"]
|
54
|
+
# Kept it duplicated for backwards compatibility
|
55
|
+
_ = process_prompt_template(
|
56
|
+
template=template,
|
57
|
+
name="template",
|
58
|
+
custom_fields=frontend_node["custom_fields"],
|
59
|
+
frontend_node_template=frontend_node["template"],
|
60
|
+
)
|
61
|
+
# Now that template is updated, we need to grab any values that were set in the current_frontend_node
|
62
|
+
# and update the frontend_node with those values
|
63
|
+
update_template_values(new_template=frontend_node, previous_template=current_frontend_node["template"])
|
64
|
+
return frontend_node
|
65
|
+
|
66
|
+
def _get_fallback_input(self, **kwargs):
|
67
|
+
return DefaultPromptField(**kwargs)
|
@@ -0,0 +1,98 @@
|
|
1
|
+
import importlib
|
2
|
+
|
3
|
+
from langchain_experimental.utilities import PythonREPL
|
4
|
+
|
5
|
+
from lfx.custom.custom_component.component import Component
|
6
|
+
from lfx.io import CodeInput, Output, StrInput
|
7
|
+
from lfx.schema.data import Data
|
8
|
+
|
9
|
+
|
10
|
+
class PythonREPLComponent(Component):
|
11
|
+
display_name = "Python Interpreter"
|
12
|
+
description = "Run Python code with optional imports. Use print() to see the output."
|
13
|
+
documentation: str = "https://docs.langflow.org/components-processing#python-interpreter"
|
14
|
+
icon = "square-terminal"
|
15
|
+
|
16
|
+
inputs = [
|
17
|
+
StrInput(
|
18
|
+
name="global_imports",
|
19
|
+
display_name="Global Imports",
|
20
|
+
info="A comma-separated list of modules to import globally, e.g. 'math,numpy,pandas'.",
|
21
|
+
value="math,pandas",
|
22
|
+
required=True,
|
23
|
+
),
|
24
|
+
CodeInput(
|
25
|
+
name="python_code",
|
26
|
+
display_name="Python Code",
|
27
|
+
info="The Python code to execute. Only modules specified in Global Imports can be used.",
|
28
|
+
value="print('Hello, World!')",
|
29
|
+
input_types=["Message"],
|
30
|
+
tool_mode=True,
|
31
|
+
required=True,
|
32
|
+
),
|
33
|
+
]
|
34
|
+
|
35
|
+
outputs = [
|
36
|
+
Output(
|
37
|
+
display_name="Results",
|
38
|
+
name="results",
|
39
|
+
type_=Data,
|
40
|
+
method="run_python_repl",
|
41
|
+
),
|
42
|
+
]
|
43
|
+
|
44
|
+
def get_globals(self, global_imports: str | list[str]) -> dict:
|
45
|
+
"""Create a globals dictionary with only the specified allowed imports."""
|
46
|
+
global_dict = {}
|
47
|
+
|
48
|
+
try:
|
49
|
+
if isinstance(global_imports, str):
|
50
|
+
modules = [module.strip() for module in global_imports.split(",")]
|
51
|
+
elif isinstance(global_imports, list):
|
52
|
+
modules = global_imports
|
53
|
+
else:
|
54
|
+
msg = "global_imports must be either a string or a list"
|
55
|
+
raise TypeError(msg)
|
56
|
+
|
57
|
+
for module in modules:
|
58
|
+
try:
|
59
|
+
imported_module = importlib.import_module(module)
|
60
|
+
global_dict[imported_module.__name__] = imported_module
|
61
|
+
except ImportError as e:
|
62
|
+
msg = f"Could not import module {module}: {e!s}"
|
63
|
+
raise ImportError(msg) from e
|
64
|
+
|
65
|
+
except Exception as e:
|
66
|
+
self.log(f"Error in global imports: {e!s}")
|
67
|
+
raise
|
68
|
+
else:
|
69
|
+
self.log(f"Successfully imported modules: {list(global_dict.keys())}")
|
70
|
+
return global_dict
|
71
|
+
|
72
|
+
def run_python_repl(self) -> Data:
|
73
|
+
try:
|
74
|
+
globals_ = self.get_globals(self.global_imports)
|
75
|
+
python_repl = PythonREPL(_globals=globals_)
|
76
|
+
result = python_repl.run(self.python_code)
|
77
|
+
result = result.strip() if result else ""
|
78
|
+
|
79
|
+
self.log("Code execution completed successfully")
|
80
|
+
return Data(data={"result": result})
|
81
|
+
|
82
|
+
except ImportError as e:
|
83
|
+
error_message = f"Import Error: {e!s}"
|
84
|
+
self.log(error_message)
|
85
|
+
return Data(data={"error": error_message})
|
86
|
+
|
87
|
+
except SyntaxError as e:
|
88
|
+
error_message = f"Syntax Error: {e!s}"
|
89
|
+
self.log(error_message)
|
90
|
+
return Data(data={"error": error_message})
|
91
|
+
|
92
|
+
except (NameError, TypeError, ValueError) as e:
|
93
|
+
error_message = f"Error during execution: {e!s}"
|
94
|
+
self.log(error_message)
|
95
|
+
return Data(data={"error": error_message})
|
96
|
+
|
97
|
+
def build(self):
|
98
|
+
return self.run_python_repl
|