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
lfx/inputs/inputs.py
ADDED
@@ -0,0 +1,714 @@
|
|
1
|
+
import warnings
|
2
|
+
from collections.abc import AsyncIterator, Iterator
|
3
|
+
from typing import Any, TypeAlias, get_args
|
4
|
+
|
5
|
+
from pandas import DataFrame
|
6
|
+
from pydantic import Field, field_validator, model_validator
|
7
|
+
|
8
|
+
from lfx.inputs.validators import CoalesceBool
|
9
|
+
from lfx.schema.data import Data
|
10
|
+
from lfx.schema.message import Message
|
11
|
+
|
12
|
+
from .input_mixin import (
|
13
|
+
AuthMixin,
|
14
|
+
BaseInputMixin,
|
15
|
+
ConnectionMixin,
|
16
|
+
DatabaseLoadMixin,
|
17
|
+
DropDownMixin,
|
18
|
+
FieldTypes,
|
19
|
+
FileMixin,
|
20
|
+
InputTraceMixin,
|
21
|
+
LinkMixin,
|
22
|
+
ListableInputMixin,
|
23
|
+
MetadataTraceMixin,
|
24
|
+
MultilineMixin,
|
25
|
+
QueryMixin,
|
26
|
+
RangeMixin,
|
27
|
+
SerializableFieldTypes,
|
28
|
+
SliderMixin,
|
29
|
+
SortableListMixin,
|
30
|
+
TableMixin,
|
31
|
+
TabMixin,
|
32
|
+
ToolModeMixin,
|
33
|
+
)
|
34
|
+
|
35
|
+
|
36
|
+
class TableInput(BaseInputMixin, MetadataTraceMixin, TableMixin, ListableInputMixin, ToolModeMixin):
|
37
|
+
field_type: SerializableFieldTypes = FieldTypes.TABLE
|
38
|
+
is_list: bool = True
|
39
|
+
|
40
|
+
@field_validator("value")
|
41
|
+
@classmethod
|
42
|
+
def validate_value(cls, v: Any, _info):
|
43
|
+
# Convert single dict or Data instance into a list.
|
44
|
+
if isinstance(v, dict | Data):
|
45
|
+
v = [v]
|
46
|
+
# Automatically convert DataFrame into a list of dictionaries.
|
47
|
+
if isinstance(v, DataFrame):
|
48
|
+
v = v.to_dict(orient="records")
|
49
|
+
# Verify the value is now a list.
|
50
|
+
if not isinstance(v, list):
|
51
|
+
msg = (
|
52
|
+
"The table input must be a list of rows. You provided a "
|
53
|
+
f"{type(v).__name__}, which cannot be converted to table format. "
|
54
|
+
"Please provide your data as either:\n"
|
55
|
+
"- A list of dictionaries (each dict is a row)\n"
|
56
|
+
"- A pandas DataFrame\n"
|
57
|
+
"- A single dictionary (will become a one-row table)\n"
|
58
|
+
"- A Data object (Langflow's internal data structure)\n"
|
59
|
+
)
|
60
|
+
raise ValueError(msg) # noqa: TRY004
|
61
|
+
# Ensure each item in the list is either a dict or a Data instance.
|
62
|
+
for i, item in enumerate(v):
|
63
|
+
if not isinstance(item, dict | Data):
|
64
|
+
msg = (
|
65
|
+
f"Row {i + 1} in your table has an invalid format. Each row must be either:\n"
|
66
|
+
"- A dictionary containing column name/value pairs\n"
|
67
|
+
"- A Data object (Langflow's internal data structure for passing data between components)\n"
|
68
|
+
f"Instead, got a {type(item).__name__}. Please check the format of your input data."
|
69
|
+
)
|
70
|
+
raise ValueError(msg) # noqa: TRY004
|
71
|
+
return v
|
72
|
+
|
73
|
+
|
74
|
+
class HandleInput(BaseInputMixin, ListableInputMixin, MetadataTraceMixin):
|
75
|
+
"""Represents an Input that has a Handle to a specific type (e.g. BaseLanguageModel, BaseRetriever, etc.).
|
76
|
+
|
77
|
+
This class inherits from the `BaseInputMixin` and `ListableInputMixin` classes.
|
78
|
+
|
79
|
+
Attributes:
|
80
|
+
input_types (list[str]): A list of input types.
|
81
|
+
field_type (SerializableFieldTypes): The field type of the input.
|
82
|
+
"""
|
83
|
+
|
84
|
+
input_types: list[str] = Field(default_factory=list)
|
85
|
+
field_type: SerializableFieldTypes = FieldTypes.OTHER
|
86
|
+
|
87
|
+
|
88
|
+
class ToolsInput(BaseInputMixin, ListableInputMixin, MetadataTraceMixin, ToolModeMixin):
|
89
|
+
"""Represents an Input that contains a list of tools to activate, deactivate, or edit.
|
90
|
+
|
91
|
+
Attributes:
|
92
|
+
field_type (SerializableFieldTypes): The field type of the input.
|
93
|
+
value (list[dict]): The value of the input.
|
94
|
+
|
95
|
+
"""
|
96
|
+
|
97
|
+
field_type: SerializableFieldTypes = FieldTypes.TOOLS
|
98
|
+
value: list[dict] = Field(default_factory=list)
|
99
|
+
is_list: bool = True
|
100
|
+
real_time_refresh: bool = True
|
101
|
+
|
102
|
+
|
103
|
+
class DataInput(HandleInput, InputTraceMixin, ListableInputMixin, ToolModeMixin):
|
104
|
+
"""Represents an Input that has a Handle that receives a Data object.
|
105
|
+
|
106
|
+
Attributes:
|
107
|
+
input_types (list[str]): A list of input types supported by this data input.
|
108
|
+
"""
|
109
|
+
|
110
|
+
input_types: list[str] = ["Data"]
|
111
|
+
|
112
|
+
|
113
|
+
class DataFrameInput(HandleInput, InputTraceMixin, ListableInputMixin, ToolModeMixin):
|
114
|
+
input_types: list[str] = ["DataFrame"]
|
115
|
+
|
116
|
+
|
117
|
+
class PromptInput(BaseInputMixin, ListableInputMixin, InputTraceMixin, ToolModeMixin):
|
118
|
+
field_type: SerializableFieldTypes = FieldTypes.PROMPT
|
119
|
+
|
120
|
+
|
121
|
+
class CodeInput(BaseInputMixin, ListableInputMixin, InputTraceMixin, ToolModeMixin):
|
122
|
+
field_type: SerializableFieldTypes = FieldTypes.CODE
|
123
|
+
|
124
|
+
|
125
|
+
# Applying mixins to a specific input type
|
126
|
+
class StrInput(
|
127
|
+
BaseInputMixin,
|
128
|
+
ListableInputMixin,
|
129
|
+
DatabaseLoadMixin,
|
130
|
+
MetadataTraceMixin,
|
131
|
+
ToolModeMixin,
|
132
|
+
):
|
133
|
+
field_type: SerializableFieldTypes = FieldTypes.TEXT
|
134
|
+
load_from_db: CoalesceBool = False
|
135
|
+
"""Defines if the field will allow the user to open a text editor. Default is False."""
|
136
|
+
|
137
|
+
@staticmethod
|
138
|
+
def _validate_value(v: Any, info):
|
139
|
+
"""Validates the given value and returns the processed value.
|
140
|
+
|
141
|
+
Args:
|
142
|
+
v (Any): The value to be validated.
|
143
|
+
info: Additional information about the input.
|
144
|
+
|
145
|
+
Returns:
|
146
|
+
The processed value.
|
147
|
+
|
148
|
+
Raises:
|
149
|
+
ValueError: If the value is not of a valid type or if the input is missing a required key.
|
150
|
+
"""
|
151
|
+
if not isinstance(v, str) and v is not None:
|
152
|
+
# Keep the warning for now, but we should change it to an error
|
153
|
+
if info.data.get("input_types") and v.__class__.__name__ not in info.data.get("input_types"):
|
154
|
+
warnings.warn(
|
155
|
+
f"Invalid value type {type(v)} for input {info.data.get('name')}. "
|
156
|
+
f"Expected types: {info.data.get('input_types')}",
|
157
|
+
stacklevel=4,
|
158
|
+
)
|
159
|
+
else:
|
160
|
+
warnings.warn(
|
161
|
+
f"Invalid value type {type(v)} for input {info.data.get('name')}.",
|
162
|
+
stacklevel=4,
|
163
|
+
)
|
164
|
+
return v
|
165
|
+
|
166
|
+
@field_validator("value")
|
167
|
+
@classmethod
|
168
|
+
def validate_value(cls, v: Any, info):
|
169
|
+
"""Validates the given value and returns the processed value.
|
170
|
+
|
171
|
+
Args:
|
172
|
+
v (Any): The value to be validated.
|
173
|
+
info: Additional information about the input.
|
174
|
+
|
175
|
+
Returns:
|
176
|
+
The processed value.
|
177
|
+
|
178
|
+
Raises:
|
179
|
+
ValueError: If the value is not of a valid type or if the input is missing a required key.
|
180
|
+
"""
|
181
|
+
is_list = info.data["is_list"]
|
182
|
+
return [cls._validate_value(vv, info) for vv in v] if is_list else cls._validate_value(v, info)
|
183
|
+
|
184
|
+
|
185
|
+
class MessageInput(StrInput, InputTraceMixin):
|
186
|
+
input_types: list[str] = ["Message"]
|
187
|
+
|
188
|
+
@staticmethod
|
189
|
+
def _validate_value(v: Any, _info):
|
190
|
+
# If v is a instance of Message, then its fine
|
191
|
+
if isinstance(v, dict):
|
192
|
+
return Message(**v)
|
193
|
+
if isinstance(v, Message):
|
194
|
+
return v
|
195
|
+
# Check for Message-like objects by examining their fields
|
196
|
+
# This handles both langflow and lfx Message instances
|
197
|
+
if hasattr(v, "text") and hasattr(v, "model_dump") and callable(v.model_dump):
|
198
|
+
# Check if it has other Message-specific attributes
|
199
|
+
message_fields = {"text", "data", "sender", "session_id", "properties"}
|
200
|
+
obj_attrs = set(dir(v))
|
201
|
+
min_message_fields = 3
|
202
|
+
if len(message_fields.intersection(obj_attrs)) >= min_message_fields:
|
203
|
+
try:
|
204
|
+
return Message(**v.model_dump())
|
205
|
+
except (TypeError, ValueError):
|
206
|
+
# Fallback to text only if model_dump fails
|
207
|
+
return Message(text=v.text)
|
208
|
+
if isinstance(v, str | AsyncIterator | Iterator):
|
209
|
+
return Message(text=v)
|
210
|
+
# For simplified implementation, we'll skip MessageBase handling
|
211
|
+
msg = f"Invalid value type {type(v)}"
|
212
|
+
raise ValueError(msg)
|
213
|
+
|
214
|
+
|
215
|
+
class MessageTextInput(StrInput, MetadataTraceMixin, InputTraceMixin, ToolModeMixin):
|
216
|
+
"""Represents a text input component for the Langflow system.
|
217
|
+
|
218
|
+
This component is used to handle text inputs in the Langflow system.
|
219
|
+
It provides methods for validating and processing text values.
|
220
|
+
|
221
|
+
Attributes:
|
222
|
+
input_types (list[str]): A list of input types that this component supports.
|
223
|
+
In this case, it supports the "Message" input type.
|
224
|
+
"""
|
225
|
+
|
226
|
+
input_types: list[str] = ["Message"]
|
227
|
+
|
228
|
+
@staticmethod
|
229
|
+
def _validate_value(v: Any, info):
|
230
|
+
"""Validates the given value and returns the processed value.
|
231
|
+
|
232
|
+
Args:
|
233
|
+
v (Any): The value to be validated.
|
234
|
+
info: Additional information about the input.
|
235
|
+
|
236
|
+
Returns:
|
237
|
+
The processed value.
|
238
|
+
|
239
|
+
Raises:
|
240
|
+
ValueError: If the value is not of a valid type or if the input is missing a required key.
|
241
|
+
"""
|
242
|
+
value: str | AsyncIterator | Iterator | None = None
|
243
|
+
if isinstance(v, dict):
|
244
|
+
v = Message(**v)
|
245
|
+
if isinstance(v, str):
|
246
|
+
value = v
|
247
|
+
elif isinstance(v, Message):
|
248
|
+
value = v.text
|
249
|
+
elif isinstance(v, Data):
|
250
|
+
if v.text_key in v.data:
|
251
|
+
value = v.data[v.text_key]
|
252
|
+
else:
|
253
|
+
keys = ", ".join(v.data.keys())
|
254
|
+
input_name = info.data["name"]
|
255
|
+
msg = (
|
256
|
+
f"The input to '{input_name}' must contain the key '{v.text_key}'."
|
257
|
+
f"You can set `text_key` to one of the following keys: {keys} "
|
258
|
+
"or set the value using another Component."
|
259
|
+
)
|
260
|
+
raise ValueError(msg)
|
261
|
+
elif isinstance(v, AsyncIterator | Iterator):
|
262
|
+
value = v
|
263
|
+
else:
|
264
|
+
msg = f"Invalid value type {type(v)}"
|
265
|
+
raise ValueError(msg) # noqa: TRY004
|
266
|
+
return value
|
267
|
+
|
268
|
+
|
269
|
+
class MultilineInput(MessageTextInput, MultilineMixin, InputTraceMixin, ToolModeMixin):
|
270
|
+
"""Represents a multiline input field.
|
271
|
+
|
272
|
+
Attributes:
|
273
|
+
field_type (SerializableFieldTypes): The type of the field. Defaults to FieldTypes.TEXT.
|
274
|
+
multiline (CoalesceBool): Indicates whether the input field should support multiple lines. Defaults to True.
|
275
|
+
"""
|
276
|
+
|
277
|
+
field_type: SerializableFieldTypes = FieldTypes.TEXT
|
278
|
+
multiline: CoalesceBool = True
|
279
|
+
copy_field: CoalesceBool = False
|
280
|
+
|
281
|
+
|
282
|
+
class MultilineSecretInput(MessageTextInput, MultilineMixin, InputTraceMixin):
|
283
|
+
"""Represents a multiline input field.
|
284
|
+
|
285
|
+
Attributes:
|
286
|
+
field_type (SerializableFieldTypes): The type of the field. Defaults to FieldTypes.TEXT.
|
287
|
+
multiline (CoalesceBool): Indicates whether the input field should support multiple lines. Defaults to True.
|
288
|
+
"""
|
289
|
+
|
290
|
+
field_type: SerializableFieldTypes = FieldTypes.PASSWORD
|
291
|
+
multiline: CoalesceBool = True
|
292
|
+
password: CoalesceBool = Field(default=True)
|
293
|
+
|
294
|
+
|
295
|
+
class SecretStrInput(BaseInputMixin, DatabaseLoadMixin):
|
296
|
+
"""Represents a field with password field type.
|
297
|
+
|
298
|
+
This class inherits from `BaseInputMixin` and `DatabaseLoadMixin`.
|
299
|
+
|
300
|
+
Attributes:
|
301
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to `FieldTypes.PASSWORD`.
|
302
|
+
password (CoalesceBool): A boolean indicating whether the input is a password. Defaults to `True`.
|
303
|
+
input_types (list[str]): A list of input types associated with this input. Defaults to an empty list.
|
304
|
+
"""
|
305
|
+
|
306
|
+
field_type: SerializableFieldTypes = FieldTypes.PASSWORD
|
307
|
+
password: CoalesceBool = Field(default=True)
|
308
|
+
input_types: list[str] = []
|
309
|
+
load_from_db: CoalesceBool = True
|
310
|
+
|
311
|
+
@field_validator("value")
|
312
|
+
@classmethod
|
313
|
+
def validate_value(cls, v: Any, info):
|
314
|
+
"""Validates the given value and returns the processed value.
|
315
|
+
|
316
|
+
Args:
|
317
|
+
v (Any): The value to be validated.
|
318
|
+
info: Additional information about the input.
|
319
|
+
|
320
|
+
Returns:
|
321
|
+
The processed value.
|
322
|
+
|
323
|
+
Raises:
|
324
|
+
ValueError: If the value is not of a valid type or if the input is missing a required key.
|
325
|
+
"""
|
326
|
+
value: str | AsyncIterator | Iterator | None = None
|
327
|
+
if isinstance(v, str):
|
328
|
+
value = v
|
329
|
+
elif isinstance(v, Message):
|
330
|
+
value = v.text
|
331
|
+
elif isinstance(v, Data):
|
332
|
+
if v.text_key in v.data:
|
333
|
+
value = v.data[v.text_key]
|
334
|
+
else:
|
335
|
+
keys = ", ".join(v.data.keys())
|
336
|
+
input_name = info.data["name"]
|
337
|
+
msg = (
|
338
|
+
f"The input to '{input_name}' must contain the key '{v.text_key}'."
|
339
|
+
f"You can set `text_key` to one of the following keys: {keys} "
|
340
|
+
"or set the value using another Component."
|
341
|
+
)
|
342
|
+
raise ValueError(msg)
|
343
|
+
elif isinstance(v, AsyncIterator | Iterator):
|
344
|
+
value = v
|
345
|
+
elif v is None:
|
346
|
+
value = None
|
347
|
+
else:
|
348
|
+
msg = f"Invalid value type `{type(v)}` for input `{info.data['name']}`"
|
349
|
+
raise ValueError(msg)
|
350
|
+
return value
|
351
|
+
|
352
|
+
|
353
|
+
class IntInput(BaseInputMixin, ListableInputMixin, RangeMixin, MetadataTraceMixin, ToolModeMixin):
|
354
|
+
"""Represents an integer field.
|
355
|
+
|
356
|
+
This class represents an integer input and provides functionality for handling integer values.
|
357
|
+
It inherits from the `BaseInputMixin`, `ListableInputMixin`, and `RangeMixin` classes.
|
358
|
+
|
359
|
+
Attributes:
|
360
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to FieldTypes.INTEGER.
|
361
|
+
"""
|
362
|
+
|
363
|
+
field_type: SerializableFieldTypes = FieldTypes.INTEGER
|
364
|
+
|
365
|
+
@field_validator("value")
|
366
|
+
@classmethod
|
367
|
+
def validate_value(cls, v: Any, info):
|
368
|
+
"""Validates the given value and returns the processed value.
|
369
|
+
|
370
|
+
Args:
|
371
|
+
v (Any): The value to be validated.
|
372
|
+
info: Additional information about the input.
|
373
|
+
|
374
|
+
Returns:
|
375
|
+
The processed value.
|
376
|
+
|
377
|
+
Raises:
|
378
|
+
ValueError: If the value is not of a valid type or if the input is missing a required key.
|
379
|
+
"""
|
380
|
+
if v and not isinstance(v, int | float):
|
381
|
+
msg = f"Invalid value type {type(v)} for input {info.data.get('name')}."
|
382
|
+
raise ValueError(msg)
|
383
|
+
if isinstance(v, float):
|
384
|
+
v = int(v)
|
385
|
+
return v
|
386
|
+
|
387
|
+
|
388
|
+
class FloatInput(BaseInputMixin, ListableInputMixin, RangeMixin, MetadataTraceMixin, ToolModeMixin):
|
389
|
+
"""Represents a float field.
|
390
|
+
|
391
|
+
This class represents a float input and provides functionality for handling float values.
|
392
|
+
It inherits from the `BaseInputMixin`, `ListableInputMixin`, and `RangeMixin` classes.
|
393
|
+
|
394
|
+
Attributes:
|
395
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to FieldTypes.FLOAT.
|
396
|
+
"""
|
397
|
+
|
398
|
+
field_type: SerializableFieldTypes = FieldTypes.FLOAT
|
399
|
+
|
400
|
+
@field_validator("value")
|
401
|
+
@classmethod
|
402
|
+
def validate_value(cls, v: Any, info):
|
403
|
+
"""Validates the given value and returns the processed value.
|
404
|
+
|
405
|
+
Args:
|
406
|
+
v (Any): The value to be validated.
|
407
|
+
info: Additional information about the input.
|
408
|
+
|
409
|
+
Returns:
|
410
|
+
The processed value.
|
411
|
+
|
412
|
+
Raises:
|
413
|
+
ValueError: If the value is not of a valid type or if the input is missing a required key.
|
414
|
+
"""
|
415
|
+
if v and not isinstance(v, int | float):
|
416
|
+
msg = f"Invalid value type {type(v)} for input {info.data.get('name')}."
|
417
|
+
raise ValueError(msg)
|
418
|
+
if isinstance(v, int):
|
419
|
+
v = float(v)
|
420
|
+
return v
|
421
|
+
|
422
|
+
|
423
|
+
class BoolInput(BaseInputMixin, ListableInputMixin, MetadataTraceMixin, ToolModeMixin):
|
424
|
+
"""Represents a boolean field.
|
425
|
+
|
426
|
+
This class represents a boolean input and provides functionality for handling boolean values.
|
427
|
+
It inherits from the `BaseInputMixin` and `ListableInputMixin` classes.
|
428
|
+
|
429
|
+
Attributes:
|
430
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to FieldTypes.BOOLEAN.
|
431
|
+
value (CoalesceBool): The value of the boolean input.
|
432
|
+
"""
|
433
|
+
|
434
|
+
field_type: SerializableFieldTypes = FieldTypes.BOOLEAN
|
435
|
+
value: CoalesceBool = False
|
436
|
+
|
437
|
+
|
438
|
+
class NestedDictInput(
|
439
|
+
BaseInputMixin,
|
440
|
+
ListableInputMixin,
|
441
|
+
MetadataTraceMixin,
|
442
|
+
InputTraceMixin,
|
443
|
+
ToolModeMixin,
|
444
|
+
):
|
445
|
+
"""Represents a nested dictionary field.
|
446
|
+
|
447
|
+
This class represents a nested dictionary input and provides functionality for handling dictionary values.
|
448
|
+
It inherits from the `BaseInputMixin` and `ListableInputMixin` classes.
|
449
|
+
|
450
|
+
Attributes:
|
451
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to FieldTypes.NESTED_DICT.
|
452
|
+
value (Optional[dict]): The value of the input. Defaults to an empty dictionary.
|
453
|
+
"""
|
454
|
+
|
455
|
+
field_type: SerializableFieldTypes = FieldTypes.NESTED_DICT
|
456
|
+
value: dict | None = {}
|
457
|
+
|
458
|
+
|
459
|
+
class DictInput(BaseInputMixin, ListableInputMixin, InputTraceMixin, ToolModeMixin):
|
460
|
+
"""Represents a dictionary field.
|
461
|
+
|
462
|
+
This class represents a dictionary input and provides functionality for handling dictionary values.
|
463
|
+
It inherits from the `BaseInputMixin` and `ListableInputMixin` classes.
|
464
|
+
|
465
|
+
Attributes:
|
466
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to FieldTypes.DICT.
|
467
|
+
value (Optional[dict]): The value of the dictionary input. Defaults to an empty dictionary.
|
468
|
+
"""
|
469
|
+
|
470
|
+
field_type: SerializableFieldTypes = FieldTypes.DICT
|
471
|
+
value: dict = Field(default_factory=dict)
|
472
|
+
|
473
|
+
|
474
|
+
class DropdownInput(BaseInputMixin, DropDownMixin, MetadataTraceMixin, ToolModeMixin):
|
475
|
+
"""Represents a dropdown input field.
|
476
|
+
|
477
|
+
This class represents a dropdown input field and provides functionality for handling dropdown values.
|
478
|
+
It inherits from the `BaseInputMixin` and `DropDownMixin` classes.
|
479
|
+
|
480
|
+
Attributes:
|
481
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to FieldTypes.TEXT.
|
482
|
+
options (Optional[Union[list[str], Callable]]): List of options for the field.
|
483
|
+
Default is None.
|
484
|
+
options_metadata (Optional[list[dict[str, str]]): List of dictionaries with metadata for each option.
|
485
|
+
Default is None.
|
486
|
+
combobox (CoalesceBool): Variable that defines if the user can insert custom values in the dropdown.
|
487
|
+
toggle (CoalesceBool): Variable that defines if a toggle button is shown.
|
488
|
+
toggle_value (CoalesceBool | None): Variable that defines the value of the toggle button. Defaults to None.
|
489
|
+
"""
|
490
|
+
|
491
|
+
field_type: SerializableFieldTypes = FieldTypes.TEXT
|
492
|
+
options: list[str] = Field(default_factory=list)
|
493
|
+
options_metadata: list[dict[str, Any]] = Field(default_factory=list)
|
494
|
+
combobox: CoalesceBool = False
|
495
|
+
dialog_inputs: dict[str, Any] = Field(default_factory=dict)
|
496
|
+
toggle: bool = False
|
497
|
+
toggle_disable: bool | None = None
|
498
|
+
toggle_value: bool | None = None
|
499
|
+
|
500
|
+
|
501
|
+
class ConnectionInput(BaseInputMixin, ConnectionMixin, MetadataTraceMixin, ToolModeMixin):
|
502
|
+
"""Represents a connection input field.
|
503
|
+
|
504
|
+
This class represents a connection input field and provides functionality for handling connection values.
|
505
|
+
It inherits from the `BaseInputMixin` and `ConnectionMixin` classes.
|
506
|
+
|
507
|
+
"""
|
508
|
+
|
509
|
+
field_type: SerializableFieldTypes = FieldTypes.CONNECTION
|
510
|
+
|
511
|
+
|
512
|
+
class AuthInput(BaseInputMixin, AuthMixin, MetadataTraceMixin):
|
513
|
+
"""Represents an authentication input field.
|
514
|
+
|
515
|
+
This class represents an authentication input field and provides functionality for handling authentication values.
|
516
|
+
It inherits from the `BaseInputMixin` and `AuthMixin` classes.
|
517
|
+
|
518
|
+
Attributes:
|
519
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to FieldTypes.AUTH.
|
520
|
+
"""
|
521
|
+
|
522
|
+
field_type: SerializableFieldTypes = FieldTypes.AUTH
|
523
|
+
show: bool = False
|
524
|
+
|
525
|
+
|
526
|
+
class QueryInput(MessageTextInput, QueryMixin):
|
527
|
+
"""Represents a query input field.
|
528
|
+
|
529
|
+
This class represents an query input field and provides functionality for handling search values.
|
530
|
+
It inherits from the `BaseInputMixin` and `QueryMixin` classes.
|
531
|
+
|
532
|
+
Attributes:
|
533
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to FieldTypes.SEARCH.
|
534
|
+
separator (str | None): The separator for the query input. Defaults to None.
|
535
|
+
value (str): The value for the query input. Defaults to an empty string.
|
536
|
+
"""
|
537
|
+
|
538
|
+
field_type: SerializableFieldTypes = FieldTypes.QUERY
|
539
|
+
separator: str | None = Field(default=None)
|
540
|
+
|
541
|
+
|
542
|
+
class SortableListInput(BaseInputMixin, SortableListMixin, MetadataTraceMixin, ToolModeMixin):
|
543
|
+
"""Represents a list selection input field.
|
544
|
+
|
545
|
+
This class represents a list selection input field and provides functionality for handling list selection values.
|
546
|
+
It inherits from the `BaseInputMixin` and `ListableInputMixin` classes.
|
547
|
+
|
548
|
+
Attributes:
|
549
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to FieldTypes.SORTABLE_LIST.
|
550
|
+
"""
|
551
|
+
|
552
|
+
field_type: SerializableFieldTypes = FieldTypes.SORTABLE_LIST
|
553
|
+
|
554
|
+
|
555
|
+
class TabInput(BaseInputMixin, TabMixin, MetadataTraceMixin, ToolModeMixin):
|
556
|
+
"""Represents a tab input field.
|
557
|
+
|
558
|
+
This class represents a tab input field that allows a maximum of 3 values, each with a maximum of 20 characters.
|
559
|
+
It inherits from the `BaseInputMixin` and `TabMixin` classes.
|
560
|
+
|
561
|
+
Attributes:
|
562
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to FieldTypes.TAB.
|
563
|
+
options (list[str]): List of tab options. Maximum of 3 values allowed, each with a maximum of 20 characters.
|
564
|
+
active_tab (int): Index of the currently active tab. Defaults to 0.
|
565
|
+
"""
|
566
|
+
|
567
|
+
field_type: SerializableFieldTypes = FieldTypes.TAB
|
568
|
+
options: list[str] = Field(default_factory=list)
|
569
|
+
|
570
|
+
@model_validator(mode="after")
|
571
|
+
@classmethod
|
572
|
+
def validate_value(cls, values):
|
573
|
+
"""Validates the value to ensure it's one of the tab values."""
|
574
|
+
options = values.options # Agora temos certeza de que options está disponível
|
575
|
+
value = values.value
|
576
|
+
|
577
|
+
if not isinstance(value, str):
|
578
|
+
msg = f"TabInput value must be a string. Got {type(value).__name__}."
|
579
|
+
raise TypeError(msg)
|
580
|
+
|
581
|
+
if value not in options and value != "":
|
582
|
+
msg = f"TabInput value must be one of the following: {options}. Got: '{value}'"
|
583
|
+
raise ValueError(msg)
|
584
|
+
|
585
|
+
return values
|
586
|
+
|
587
|
+
|
588
|
+
class MultiselectInput(BaseInputMixin, ListableInputMixin, DropDownMixin, MetadataTraceMixin, ToolModeMixin):
|
589
|
+
"""Represents a multiselect input field.
|
590
|
+
|
591
|
+
This class represents a multiselect input field and provides functionality for handling multiselect values.
|
592
|
+
It inherits from the `BaseInputMixin`, `ListableInputMixin` and `DropDownMixin` classes.
|
593
|
+
|
594
|
+
Attributes:
|
595
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to FieldTypes.TEXT.
|
596
|
+
options (Optional[Union[list[str], Callable]]): List of options for the field. Only used when is_list=True.
|
597
|
+
Default is None.
|
598
|
+
"""
|
599
|
+
|
600
|
+
field_type: SerializableFieldTypes = FieldTypes.TEXT
|
601
|
+
options: list[str] = Field(default_factory=list)
|
602
|
+
is_list: bool = Field(default=True, serialization_alias="list")
|
603
|
+
combobox: CoalesceBool = False
|
604
|
+
|
605
|
+
@field_validator("value")
|
606
|
+
@classmethod
|
607
|
+
def validate_value(cls, v: Any, _info):
|
608
|
+
# Check if value is a list of dicts
|
609
|
+
if not isinstance(v, list):
|
610
|
+
msg = f"MultiselectInput value must be a list. Value: '{v}'"
|
611
|
+
raise ValueError(msg) # noqa: TRY004
|
612
|
+
for item in v:
|
613
|
+
if not isinstance(item, str):
|
614
|
+
msg = f"MultiselectInput value must be a list of strings. Item: '{item}' is not a string"
|
615
|
+
raise ValueError(msg) # noqa: TRY004
|
616
|
+
return v
|
617
|
+
|
618
|
+
|
619
|
+
class FileInput(BaseInputMixin, ListableInputMixin, FileMixin, MetadataTraceMixin):
|
620
|
+
"""Represents a file field.
|
621
|
+
|
622
|
+
This class represents a file input and provides functionality for handling file values.
|
623
|
+
It inherits from the `BaseInputMixin`, `ListableInputMixin`, and `FileMixin` classes.
|
624
|
+
|
625
|
+
Attributes:
|
626
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to FieldTypes.FILE.
|
627
|
+
"""
|
628
|
+
|
629
|
+
field_type: SerializableFieldTypes = FieldTypes.FILE
|
630
|
+
|
631
|
+
|
632
|
+
class McpInput(BaseInputMixin, MetadataTraceMixin):
|
633
|
+
"""Represents a mcp input field.
|
634
|
+
|
635
|
+
This class represents a mcp input and provides functionality for handling mcp values.
|
636
|
+
It inherits from the `BaseInputMixin` and `MetadataTraceMixin` classes.
|
637
|
+
|
638
|
+
Attributes:
|
639
|
+
field_type (SerializableFieldTypes): The field type of the input. Defaults to FieldTypes.MCP.
|
640
|
+
"""
|
641
|
+
|
642
|
+
field_type: SerializableFieldTypes = FieldTypes.MCP
|
643
|
+
value: dict[str, Any] = Field(default_factory=dict)
|
644
|
+
|
645
|
+
|
646
|
+
class LinkInput(BaseInputMixin, LinkMixin):
|
647
|
+
field_type: SerializableFieldTypes = FieldTypes.LINK
|
648
|
+
|
649
|
+
|
650
|
+
class SliderInput(BaseInputMixin, RangeMixin, SliderMixin, ToolModeMixin):
|
651
|
+
field_type: SerializableFieldTypes = FieldTypes.SLIDER
|
652
|
+
|
653
|
+
|
654
|
+
DEFAULT_PROMPT_INTUT_TYPES = ["Message"]
|
655
|
+
|
656
|
+
from lfx.template.field.base import Input # noqa: E402
|
657
|
+
|
658
|
+
|
659
|
+
class DefaultPromptField(Input):
|
660
|
+
name: str
|
661
|
+
display_name: str | None = None
|
662
|
+
field_type: str = "str"
|
663
|
+
advanced: bool = False
|
664
|
+
multiline: bool = True
|
665
|
+
input_types: list[str] = DEFAULT_PROMPT_INTUT_TYPES
|
666
|
+
value: Any = "" # Set the value to empty string
|
667
|
+
|
668
|
+
|
669
|
+
InputTypes: TypeAlias = (
|
670
|
+
Input
|
671
|
+
| AuthInput
|
672
|
+
| QueryInput
|
673
|
+
| DefaultPromptField
|
674
|
+
| BoolInput
|
675
|
+
| DataInput
|
676
|
+
| DictInput
|
677
|
+
| DropdownInput
|
678
|
+
| MultiselectInput
|
679
|
+
| SortableListInput
|
680
|
+
| ConnectionInput
|
681
|
+
| FileInput
|
682
|
+
| FloatInput
|
683
|
+
| HandleInput
|
684
|
+
| IntInput
|
685
|
+
| McpInput
|
686
|
+
| MultilineInput
|
687
|
+
| MultilineSecretInput
|
688
|
+
| NestedDictInput
|
689
|
+
| ToolsInput
|
690
|
+
| PromptInput
|
691
|
+
| CodeInput
|
692
|
+
| SecretStrInput
|
693
|
+
| StrInput
|
694
|
+
| MessageTextInput
|
695
|
+
| MessageInput
|
696
|
+
| TableInput
|
697
|
+
| LinkInput
|
698
|
+
| SliderInput
|
699
|
+
| DataFrameInput
|
700
|
+
| TabInput
|
701
|
+
)
|
702
|
+
|
703
|
+
InputTypesMap: dict[str, type[InputTypes]] = {t.__name__: t for t in get_args(InputTypes)}
|
704
|
+
|
705
|
+
|
706
|
+
def instantiate_input(input_type: str, data: dict) -> InputTypes:
|
707
|
+
input_type_class = InputTypesMap.get(input_type)
|
708
|
+
if "type" in data:
|
709
|
+
# Replace with field_type
|
710
|
+
data["field_type"] = data.pop("type")
|
711
|
+
if input_type_class:
|
712
|
+
return input_type_class(**data)
|
713
|
+
msg = f"Invalid input type: {input_type}"
|
714
|
+
raise ValueError(msg)
|