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/io/schema.py
ADDED
@@ -0,0 +1,289 @@
|
|
1
|
+
from types import UnionType
|
2
|
+
from typing import Any, Literal, Union, get_args, get_origin
|
3
|
+
|
4
|
+
from pydantic import BaseModel, Field, create_model
|
5
|
+
|
6
|
+
from lfx.inputs.input_mixin import FieldTypes
|
7
|
+
from lfx.inputs.inputs import (
|
8
|
+
BoolInput,
|
9
|
+
DictInput,
|
10
|
+
DropdownInput,
|
11
|
+
FloatInput,
|
12
|
+
InputTypes,
|
13
|
+
IntInput,
|
14
|
+
MessageTextInput,
|
15
|
+
)
|
16
|
+
from lfx.schema.dotdict import dotdict
|
17
|
+
|
18
|
+
_convert_field_type_to_type: dict[FieldTypes, type] = {
|
19
|
+
FieldTypes.TEXT: str,
|
20
|
+
FieldTypes.INTEGER: int,
|
21
|
+
FieldTypes.FLOAT: float,
|
22
|
+
FieldTypes.BOOLEAN: bool,
|
23
|
+
FieldTypes.DICT: dict,
|
24
|
+
FieldTypes.NESTED_DICT: dict,
|
25
|
+
FieldTypes.TABLE: dict,
|
26
|
+
FieldTypes.FILE: str,
|
27
|
+
FieldTypes.PROMPT: str,
|
28
|
+
FieldTypes.CODE: str,
|
29
|
+
FieldTypes.OTHER: str,
|
30
|
+
FieldTypes.TAB: str,
|
31
|
+
FieldTypes.QUERY: str,
|
32
|
+
}
|
33
|
+
|
34
|
+
|
35
|
+
_convert_type_to_field_type = {
|
36
|
+
str: MessageTextInput,
|
37
|
+
int: IntInput,
|
38
|
+
float: FloatInput,
|
39
|
+
bool: BoolInput,
|
40
|
+
dict: DictInput,
|
41
|
+
list: MessageTextInput,
|
42
|
+
}
|
43
|
+
|
44
|
+
|
45
|
+
def flatten_schema(root_schema: dict[str, Any]) -> dict[str, Any]:
|
46
|
+
"""Flatten a JSON RPC style schema into a single level JSON Schema.
|
47
|
+
|
48
|
+
If the input schema is already flat (no $defs / $ref / nested objects or arrays)
|
49
|
+
the function simply returns the original i.e. a noop.
|
50
|
+
"""
|
51
|
+
defs = root_schema.get("$defs", {})
|
52
|
+
|
53
|
+
# --- Fast path: schema is already flat ---------------------------------
|
54
|
+
props = root_schema.get("properties", {})
|
55
|
+
if not defs and all("$ref" not in v and v.get("type") not in ("object", "array") for v in props.values()):
|
56
|
+
return root_schema
|
57
|
+
# -----------------------------------------------------------------------
|
58
|
+
|
59
|
+
flat_props: dict[str, dict[str, Any]] = {}
|
60
|
+
required_list: list[str] = []
|
61
|
+
|
62
|
+
def _resolve_if_ref(schema: dict[str, Any]) -> dict[str, Any]:
|
63
|
+
while "$ref" in schema:
|
64
|
+
ref_name = schema["$ref"].split("/")[-1]
|
65
|
+
schema = defs.get(ref_name, {})
|
66
|
+
return schema
|
67
|
+
|
68
|
+
def _walk(name: str, schema: dict[str, Any], *, inherited_req: bool) -> None:
|
69
|
+
schema = _resolve_if_ref(schema)
|
70
|
+
t = schema.get("type")
|
71
|
+
|
72
|
+
# ── objects ─────────────────────────────────────────────────────────
|
73
|
+
if t == "object":
|
74
|
+
req_here = set(schema.get("required", []))
|
75
|
+
for k, subschema in schema.get("properties", {}).items():
|
76
|
+
child_name = f"{name}.{k}" if name else k
|
77
|
+
_walk(name=child_name, schema=subschema, inherited_req=inherited_req and k in req_here)
|
78
|
+
return
|
79
|
+
|
80
|
+
# ── arrays (always recurse into the first item as "[0]") ───────────
|
81
|
+
if t == "array":
|
82
|
+
items = schema.get("items", {})
|
83
|
+
_walk(name=f"{name}[0]", schema=items, inherited_req=inherited_req)
|
84
|
+
return
|
85
|
+
|
86
|
+
leaf: dict[str, Any] = {
|
87
|
+
k: v
|
88
|
+
for k, v in schema.items()
|
89
|
+
if k
|
90
|
+
in (
|
91
|
+
"type",
|
92
|
+
"description",
|
93
|
+
"pattern",
|
94
|
+
"format",
|
95
|
+
"enum",
|
96
|
+
"default",
|
97
|
+
"minLength",
|
98
|
+
"maxLength",
|
99
|
+
"minimum",
|
100
|
+
"maximum",
|
101
|
+
"exclusiveMinimum",
|
102
|
+
"exclusiveMaximum",
|
103
|
+
"additionalProperties",
|
104
|
+
"examples",
|
105
|
+
)
|
106
|
+
}
|
107
|
+
flat_props[name] = leaf
|
108
|
+
if inherited_req:
|
109
|
+
required_list.append(name)
|
110
|
+
|
111
|
+
# kick things off at the true root
|
112
|
+
root_required = set(root_schema.get("required", []))
|
113
|
+
for k, subschema in props.items():
|
114
|
+
_walk(k, subschema, inherited_req=k in root_required)
|
115
|
+
|
116
|
+
# build the flattened schema; keep any descriptive metadata
|
117
|
+
result: dict[str, Any] = {
|
118
|
+
"type": "object",
|
119
|
+
"properties": flat_props,
|
120
|
+
**{k: v for k, v in root_schema.items() if k not in ("properties", "$defs")},
|
121
|
+
}
|
122
|
+
if required_list:
|
123
|
+
result["required"] = required_list
|
124
|
+
return result
|
125
|
+
|
126
|
+
|
127
|
+
def schema_to_langflow_inputs(schema: type[BaseModel]) -> list[InputTypes]:
|
128
|
+
inputs: list[InputTypes] = []
|
129
|
+
|
130
|
+
for field_name, model_field in schema.model_fields.items():
|
131
|
+
ann = model_field.annotation
|
132
|
+
if isinstance(ann, UnionType):
|
133
|
+
# Extract non-None types from Union
|
134
|
+
non_none_types = [t for t in get_args(ann) if t is not type(None)]
|
135
|
+
if len(non_none_types) == 1:
|
136
|
+
ann = non_none_types[0]
|
137
|
+
|
138
|
+
is_list = False
|
139
|
+
|
140
|
+
if get_origin(ann) is list:
|
141
|
+
is_list = True
|
142
|
+
ann = get_args(ann)[0]
|
143
|
+
|
144
|
+
options: list[Any] | None = None
|
145
|
+
if get_origin(ann) is Literal:
|
146
|
+
options = list(get_args(ann))
|
147
|
+
if options:
|
148
|
+
ann = type(options[0])
|
149
|
+
|
150
|
+
if get_origin(ann) is Union:
|
151
|
+
non_none = [t for t in get_args(ann) if t is not type(None)]
|
152
|
+
if len(non_none) == 1:
|
153
|
+
ann = non_none[0]
|
154
|
+
|
155
|
+
# 2) Enumerated choices
|
156
|
+
if options is not None:
|
157
|
+
inputs.append(
|
158
|
+
DropdownInput(
|
159
|
+
display_name=model_field.title or field_name.replace("_", " ").title(),
|
160
|
+
name=field_name,
|
161
|
+
info=model_field.description or "",
|
162
|
+
required=model_field.is_required(),
|
163
|
+
is_list=is_list,
|
164
|
+
options=options,
|
165
|
+
)
|
166
|
+
)
|
167
|
+
continue
|
168
|
+
|
169
|
+
# 3) "Any" fallback → text
|
170
|
+
if ann is Any:
|
171
|
+
inputs.append(
|
172
|
+
MessageTextInput(
|
173
|
+
display_name=model_field.title or field_name.replace("_", " ").title(),
|
174
|
+
name=field_name,
|
175
|
+
info=model_field.description or "",
|
176
|
+
required=model_field.is_required(),
|
177
|
+
is_list=is_list,
|
178
|
+
)
|
179
|
+
)
|
180
|
+
continue
|
181
|
+
|
182
|
+
# 4) Primitive via your mapping
|
183
|
+
try:
|
184
|
+
lf_cls = _convert_type_to_field_type[ann]
|
185
|
+
except KeyError as err:
|
186
|
+
msg = f"Unsupported field type: {ann}"
|
187
|
+
raise TypeError(msg) from err
|
188
|
+
inputs.append(
|
189
|
+
lf_cls(
|
190
|
+
display_name=model_field.title or field_name.replace("_", " ").title(),
|
191
|
+
name=field_name,
|
192
|
+
info=model_field.description or "",
|
193
|
+
required=model_field.is_required(),
|
194
|
+
is_list=is_list,
|
195
|
+
)
|
196
|
+
)
|
197
|
+
|
198
|
+
return inputs
|
199
|
+
|
200
|
+
|
201
|
+
def create_input_schema(inputs: list["InputTypes"]) -> type[BaseModel]:
|
202
|
+
if not isinstance(inputs, list):
|
203
|
+
msg = "inputs must be a list of Inputs"
|
204
|
+
raise TypeError(msg)
|
205
|
+
fields = {}
|
206
|
+
for input_model in inputs:
|
207
|
+
# Create a Pydantic Field for each input field
|
208
|
+
field_type = input_model.field_type
|
209
|
+
if isinstance(field_type, FieldTypes):
|
210
|
+
field_type = _convert_field_type_to_type[field_type]
|
211
|
+
else:
|
212
|
+
msg = f"Invalid field type: {field_type}"
|
213
|
+
raise TypeError(msg)
|
214
|
+
if hasattr(input_model, "options") and isinstance(input_model.options, list) and input_model.options:
|
215
|
+
literal_string = f"Literal{input_model.options}"
|
216
|
+
# validate that the literal_string is a valid literal
|
217
|
+
|
218
|
+
field_type = eval(literal_string, {"Literal": Literal}) # noqa: S307
|
219
|
+
if hasattr(input_model, "is_list") and input_model.is_list:
|
220
|
+
field_type = list[field_type] # type: ignore[valid-type]
|
221
|
+
if input_model.name:
|
222
|
+
name = input_model.name.replace("_", " ").title()
|
223
|
+
elif input_model.display_name:
|
224
|
+
name = input_model.display_name
|
225
|
+
else:
|
226
|
+
msg = "Input name or display_name is required"
|
227
|
+
raise ValueError(msg)
|
228
|
+
field_dict = {
|
229
|
+
"title": name,
|
230
|
+
"description": input_model.info or "",
|
231
|
+
}
|
232
|
+
if input_model.required is False:
|
233
|
+
field_dict["default"] = input_model.value # type: ignore[assignment]
|
234
|
+
pydantic_field = Field(**field_dict)
|
235
|
+
|
236
|
+
fields[input_model.name] = (field_type, pydantic_field)
|
237
|
+
|
238
|
+
# Create and return the InputSchema model
|
239
|
+
model = create_model("InputSchema", **fields)
|
240
|
+
model.model_rebuild()
|
241
|
+
return model
|
242
|
+
|
243
|
+
|
244
|
+
def create_input_schema_from_dict(inputs: list[dotdict], param_key: str | None = None) -> type[BaseModel]:
|
245
|
+
if not isinstance(inputs, list):
|
246
|
+
msg = "inputs must be a list of Inputs"
|
247
|
+
raise TypeError(msg)
|
248
|
+
fields = {}
|
249
|
+
for input_model in inputs:
|
250
|
+
# Create a Pydantic Field for each input field
|
251
|
+
field_type = input_model.type
|
252
|
+
if hasattr(input_model, "options") and isinstance(input_model.options, list) and input_model.options:
|
253
|
+
literal_string = f"Literal{input_model.options}"
|
254
|
+
# validate that the literal_string is a valid literal
|
255
|
+
|
256
|
+
field_type = eval(literal_string, {"Literal": Literal}) # noqa: S307
|
257
|
+
if hasattr(input_model, "is_list") and input_model.is_list:
|
258
|
+
field_type = list[field_type] # type: ignore[valid-type]
|
259
|
+
if input_model.name:
|
260
|
+
name = input_model.name.replace("_", " ").title()
|
261
|
+
elif input_model.display_name:
|
262
|
+
name = input_model.display_name
|
263
|
+
else:
|
264
|
+
msg = "Input name or display_name is required"
|
265
|
+
raise ValueError(msg)
|
266
|
+
field_dict = {
|
267
|
+
"title": name,
|
268
|
+
"description": input_model.info or "",
|
269
|
+
}
|
270
|
+
if input_model.required is False:
|
271
|
+
field_dict["default"] = input_model.value # type: ignore[assignment]
|
272
|
+
pydantic_field = Field(**field_dict)
|
273
|
+
|
274
|
+
fields[input_model.name] = (field_type, pydantic_field)
|
275
|
+
|
276
|
+
# Wrap fields in a dictionary with the key as param_key
|
277
|
+
if param_key is not None:
|
278
|
+
# Create an inner model with the fields
|
279
|
+
inner_model = create_model("InnerModel", **fields)
|
280
|
+
|
281
|
+
# Ensure the model is wrapped correctly in a dictionary
|
282
|
+
# model = create_model("InputSchema", **{param_key: (inner_model, Field(default=..., description=description))})
|
283
|
+
model = create_model("InputSchema", **{param_key: (inner_model, ...)})
|
284
|
+
else:
|
285
|
+
# Create and return the InputSchema model
|
286
|
+
model = create_model("InputSchema", **fields)
|
287
|
+
|
288
|
+
model.model_rebuild()
|
289
|
+
return model
|
lfx/load/__init__.py
ADDED
lfx/load/load.py
ADDED
@@ -0,0 +1,256 @@
|
|
1
|
+
import json
|
2
|
+
from io import StringIO
|
3
|
+
from pathlib import Path
|
4
|
+
from typing import TYPE_CHECKING
|
5
|
+
|
6
|
+
from aiofile import async_open
|
7
|
+
from dotenv import dotenv_values
|
8
|
+
|
9
|
+
from lfx.graph.schema import RunOutputs
|
10
|
+
|
11
|
+
if TYPE_CHECKING:
|
12
|
+
from lfx.graph.graph.base import Graph
|
13
|
+
|
14
|
+
from lfx.load.utils import replace_tweaks_with_env
|
15
|
+
from lfx.log.logger import configure
|
16
|
+
from lfx.processing.process import process_tweaks, run_graph
|
17
|
+
from lfx.utils.async_helpers import run_until_complete
|
18
|
+
from lfx.utils.util import update_settings
|
19
|
+
|
20
|
+
|
21
|
+
async def aload_flow_from_json(
|
22
|
+
flow: Path | str | dict,
|
23
|
+
*,
|
24
|
+
tweaks: dict | None = None,
|
25
|
+
log_level: str | None = None,
|
26
|
+
log_file: str | None = None,
|
27
|
+
log_rotation: str | None = None,
|
28
|
+
env_file: str | None = None,
|
29
|
+
cache: str | None = None,
|
30
|
+
disable_logs: bool | None = True,
|
31
|
+
) -> "Graph":
|
32
|
+
"""Load a flow graph from a JSON file or a JSON object.
|
33
|
+
|
34
|
+
Args:
|
35
|
+
flow (Union[Path, str, dict]): The flow to load. It can be a file path (str or Path object)
|
36
|
+
or a JSON object (dict).
|
37
|
+
tweaks (Optional[dict]): Optional tweaks to apply to the loaded flow graph.
|
38
|
+
log_level (Optional[str]): Optional log level to configure for the flow processing.
|
39
|
+
log_file (Optional[str]): Optional log file to configure for the flow processing.
|
40
|
+
log_rotation (Optional[str]): Optional log rotation(Time/Size) to configure for the flow processing.
|
41
|
+
env_file (Optional[str]): Optional .env file to override environment variables.
|
42
|
+
cache (Optional[str]): Optional cache path to update the flow settings.
|
43
|
+
disable_logs (Optional[bool], default=True): Optional flag to disable logs during flow processing.
|
44
|
+
If log_level or log_file are set, disable_logs is not used.
|
45
|
+
|
46
|
+
Returns:
|
47
|
+
Graph: The loaded flow graph as a Graph object.
|
48
|
+
|
49
|
+
Raises:
|
50
|
+
TypeError: If the input is neither a file path (str or Path object) nor a JSON object (dict).
|
51
|
+
|
52
|
+
"""
|
53
|
+
# If input is a file path, load JSON from the file
|
54
|
+
log_file_path = Path(log_file) if log_file else None
|
55
|
+
configure(log_level=log_level, log_file=log_file_path, disable=disable_logs, log_rotation=log_rotation)
|
56
|
+
|
57
|
+
# override env variables with .env file
|
58
|
+
if env_file and tweaks is not None:
|
59
|
+
async with async_open(Path(env_file), encoding="utf-8") as f:
|
60
|
+
content = await f.read()
|
61
|
+
env_vars = dotenv_values(stream=StringIO(content))
|
62
|
+
tweaks = replace_tweaks_with_env(tweaks=tweaks, env_vars=env_vars)
|
63
|
+
|
64
|
+
# Update settings with cache and components path
|
65
|
+
await update_settings(cache=cache)
|
66
|
+
|
67
|
+
if isinstance(flow, str | Path):
|
68
|
+
async with async_open(Path(flow), encoding="utf-8") as f:
|
69
|
+
content = await f.read()
|
70
|
+
flow_graph = json.loads(content)
|
71
|
+
# If input is a dictionary, assume it's a JSON object
|
72
|
+
elif isinstance(flow, dict):
|
73
|
+
flow_graph = flow
|
74
|
+
else:
|
75
|
+
msg = "Input must be either a file path (str) or a JSON object (dict)"
|
76
|
+
raise TypeError(msg)
|
77
|
+
|
78
|
+
graph_data = flow_graph["data"]
|
79
|
+
if tweaks is not None:
|
80
|
+
graph_data = process_tweaks(graph_data, tweaks)
|
81
|
+
|
82
|
+
from lfx.graph.graph.base import Graph
|
83
|
+
|
84
|
+
return Graph.from_payload(graph_data)
|
85
|
+
|
86
|
+
|
87
|
+
def load_flow_from_json(
|
88
|
+
flow: Path | str | dict,
|
89
|
+
*,
|
90
|
+
tweaks: dict | None = None,
|
91
|
+
log_level: str | None = None,
|
92
|
+
log_file: str | None = None,
|
93
|
+
log_rotation: str | None = None,
|
94
|
+
env_file: str | None = None,
|
95
|
+
cache: str | None = None,
|
96
|
+
disable_logs: bool | None = True,
|
97
|
+
) -> "Graph":
|
98
|
+
"""Load a flow graph from a JSON file or a JSON object.
|
99
|
+
|
100
|
+
Args:
|
101
|
+
flow (Union[Path, str, dict]): The flow to load. It can be a file path (str or Path object)
|
102
|
+
or a JSON object (dict).
|
103
|
+
tweaks (Optional[dict]): Optional tweaks to apply to the loaded flow graph.
|
104
|
+
log_level (Optional[str]): Optional log level to configure for the flow processing.
|
105
|
+
log_file (Optional[str]): Optional log file to configure for the flow processing.
|
106
|
+
log_rotation (Optional[str]): Optional log rotation(Time/Size) to configure for the flow processing.
|
107
|
+
env_file (Optional[str]): Optional .env file to override environment variables.
|
108
|
+
cache (Optional[str]): Optional cache path to update the flow settings.
|
109
|
+
disable_logs (Optional[bool], default=True): Optional flag to disable logs during flow processing.
|
110
|
+
If log_level or log_file are set, disable_logs is not used.
|
111
|
+
|
112
|
+
Returns:
|
113
|
+
Graph: The loaded flow graph as a Graph object.
|
114
|
+
|
115
|
+
Raises:
|
116
|
+
TypeError: If the input is neither a file path (str or Path object) nor a JSON object (dict).
|
117
|
+
|
118
|
+
"""
|
119
|
+
return run_until_complete(
|
120
|
+
aload_flow_from_json(
|
121
|
+
flow,
|
122
|
+
tweaks=tweaks,
|
123
|
+
log_level=log_level,
|
124
|
+
log_file=log_file,
|
125
|
+
log_rotation=log_rotation,
|
126
|
+
env_file=env_file,
|
127
|
+
cache=cache,
|
128
|
+
disable_logs=disable_logs,
|
129
|
+
)
|
130
|
+
)
|
131
|
+
|
132
|
+
|
133
|
+
async def arun_flow_from_json(
|
134
|
+
flow: Path | str | dict,
|
135
|
+
input_value: str,
|
136
|
+
*,
|
137
|
+
session_id: str | None = None,
|
138
|
+
tweaks: dict | None = None,
|
139
|
+
input_type: str = "chat",
|
140
|
+
output_type: str = "chat",
|
141
|
+
output_component: str | None = None,
|
142
|
+
log_level: str | None = None,
|
143
|
+
log_file: str | None = None,
|
144
|
+
log_rotation: str | None = None,
|
145
|
+
env_file: str | None = None,
|
146
|
+
cache: str | None = None,
|
147
|
+
disable_logs: bool | None = True,
|
148
|
+
fallback_to_env_vars: bool = False,
|
149
|
+
) -> list[RunOutputs]:
|
150
|
+
"""Run a flow from a JSON file or dictionary.
|
151
|
+
|
152
|
+
Args:
|
153
|
+
flow (Union[Path, str, dict]): The path to the JSON file or the JSON dictionary representing the flow.
|
154
|
+
input_value (str): The input value to be processed by the flow.
|
155
|
+
session_id (str | None, optional): The session ID to be used for the flow. Defaults to None.
|
156
|
+
tweaks (Optional[dict], optional): Optional tweaks to be applied to the flow. Defaults to None.
|
157
|
+
input_type (str, optional): The type of the input value. Defaults to "chat".
|
158
|
+
output_type (str, optional): The type of the output value. Defaults to "chat".
|
159
|
+
output_component (Optional[str], optional): The specific component to output. Defaults to None.
|
160
|
+
log_level (Optional[str], optional): The log level to use. Defaults to None.
|
161
|
+
log_file (Optional[str], optional): The log file to write logs to. Defaults to None.
|
162
|
+
log_rotation (Optional[str], optional): The log rotation to use. Defaults to None.
|
163
|
+
env_file (Optional[str], optional): The environment file to load. Defaults to None.
|
164
|
+
cache (Optional[str], optional): The cache directory to use. Defaults to None.
|
165
|
+
disable_logs (Optional[bool], optional): Whether to disable logs. Defaults to True.
|
166
|
+
fallback_to_env_vars (bool, optional): Whether Global Variables should fallback to environment variables if
|
167
|
+
not found. Defaults to False.
|
168
|
+
|
169
|
+
Returns:
|
170
|
+
List[RunOutputs]: A list of RunOutputs objects representing the results of running the flow.
|
171
|
+
"""
|
172
|
+
if tweaks is None:
|
173
|
+
tweaks = {}
|
174
|
+
tweaks["stream"] = False
|
175
|
+
graph = await aload_flow_from_json(
|
176
|
+
flow=flow,
|
177
|
+
tweaks=tweaks,
|
178
|
+
log_level=log_level,
|
179
|
+
log_file=log_file,
|
180
|
+
log_rotation=log_rotation,
|
181
|
+
env_file=env_file,
|
182
|
+
cache=cache,
|
183
|
+
disable_logs=disable_logs,
|
184
|
+
)
|
185
|
+
return await run_graph(
|
186
|
+
graph=graph,
|
187
|
+
session_id=session_id,
|
188
|
+
input_value=input_value,
|
189
|
+
input_type=input_type,
|
190
|
+
output_type=output_type,
|
191
|
+
output_component=output_component,
|
192
|
+
fallback_to_env_vars=fallback_to_env_vars,
|
193
|
+
)
|
194
|
+
|
195
|
+
|
196
|
+
def run_flow_from_json(
|
197
|
+
flow: Path | str | dict,
|
198
|
+
input_value: str,
|
199
|
+
*,
|
200
|
+
session_id: str | None = None,
|
201
|
+
tweaks: dict | None = None,
|
202
|
+
input_type: str = "chat",
|
203
|
+
output_type: str = "chat",
|
204
|
+
output_component: str | None = None,
|
205
|
+
log_level: str | None = None,
|
206
|
+
log_file: str | None = None,
|
207
|
+
log_rotation: str | None = None,
|
208
|
+
env_file: str | None = None,
|
209
|
+
cache: str | None = None,
|
210
|
+
disable_logs: bool | None = True,
|
211
|
+
fallback_to_env_vars: bool = False,
|
212
|
+
) -> list[RunOutputs]:
|
213
|
+
"""Run a flow from a JSON file or dictionary.
|
214
|
+
|
215
|
+
Note:
|
216
|
+
This function is a synchronous wrapper around `arun_flow_from_json`.
|
217
|
+
It creates an event loop if one does not exist and runs the flow.
|
218
|
+
|
219
|
+
Args:
|
220
|
+
flow (Union[Path, str, dict]): The path to the JSON file or the JSON dictionary representing the flow.
|
221
|
+
input_value (str): The input value to be processed by the flow.
|
222
|
+
session_id (str | None, optional): The session ID to be used for the flow. Defaults to None.
|
223
|
+
tweaks (Optional[dict], optional): Optional tweaks to be applied to the flow. Defaults to None.
|
224
|
+
input_type (str, optional): The type of the input value. Defaults to "chat".
|
225
|
+
output_type (str, optional): The type of the output value. Defaults to "chat".
|
226
|
+
output_component (Optional[str], optional): The specific component to output. Defaults to None.
|
227
|
+
log_level (Optional[str], optional): The log level to use. Defaults to None.
|
228
|
+
log_file (Optional[str], optional): The log file to write logs to. Defaults to None.
|
229
|
+
log_rotation (Optional[str], optional): The log rotation to use. Defaults to None.
|
230
|
+
env_file (Optional[str], optional): The environment file to load. Defaults to None.
|
231
|
+
cache (Optional[str], optional): The cache directory to use. Defaults to None.
|
232
|
+
disable_logs (Optional[bool], optional): Whether to disable logs. Defaults to True.
|
233
|
+
fallback_to_env_vars (bool, optional): Whether Global Variables should fallback to environment variables if
|
234
|
+
not found. Defaults to False.
|
235
|
+
|
236
|
+
Returns:
|
237
|
+
List[RunOutputs]: A list of RunOutputs objects representing the results of running the flow.
|
238
|
+
"""
|
239
|
+
return run_until_complete(
|
240
|
+
arun_flow_from_json(
|
241
|
+
flow,
|
242
|
+
input_value,
|
243
|
+
session_id=session_id,
|
244
|
+
tweaks=tweaks,
|
245
|
+
input_type=input_type,
|
246
|
+
output_type=output_type,
|
247
|
+
output_component=output_component,
|
248
|
+
log_level=log_level,
|
249
|
+
log_file=log_file,
|
250
|
+
log_rotation=log_rotation,
|
251
|
+
env_file=env_file,
|
252
|
+
cache=cache,
|
253
|
+
disable_logs=disable_logs,
|
254
|
+
fallback_to_env_vars=fallback_to_env_vars,
|
255
|
+
)
|
256
|
+
)
|
lfx/load/utils.py
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
|
3
|
+
import httpx
|
4
|
+
|
5
|
+
|
6
|
+
class UploadError(Exception):
|
7
|
+
"""Raised when an error occurs during the upload process."""
|
8
|
+
|
9
|
+
|
10
|
+
def upload(file_path: str, host: str, flow_id: str):
|
11
|
+
"""Upload a file to Langflow and return the file path.
|
12
|
+
|
13
|
+
Args:
|
14
|
+
file_path (str): The path to the file to be uploaded.
|
15
|
+
host (str): The host URL of Langflow.
|
16
|
+
flow_id (UUID): The ID of the flow to which the file belongs.
|
17
|
+
|
18
|
+
Returns:
|
19
|
+
dict: A dictionary containing the file path.
|
20
|
+
|
21
|
+
Raises:
|
22
|
+
UploadError: If an error occurs during the upload process.
|
23
|
+
"""
|
24
|
+
try:
|
25
|
+
url = f"{host}/api/v1/upload/{flow_id}"
|
26
|
+
with Path(file_path).open("rb") as file:
|
27
|
+
response = httpx.post(url, files={"file": file})
|
28
|
+
if response.status_code in {httpx.codes.OK, httpx.codes.CREATED}:
|
29
|
+
return response.json()
|
30
|
+
except Exception as e:
|
31
|
+
msg = f"Error uploading file: {e}"
|
32
|
+
raise UploadError(msg) from e
|
33
|
+
|
34
|
+
msg = f"Error uploading file: {response.status_code}"
|
35
|
+
raise UploadError(msg)
|
36
|
+
|
37
|
+
|
38
|
+
def upload_file(file_path: str, host: str, flow_id: str, components: list[str], tweaks: dict | None = None):
|
39
|
+
"""Upload a file to Langflow and return the file path.
|
40
|
+
|
41
|
+
Args:
|
42
|
+
file_path (str): The path to the file to be uploaded.
|
43
|
+
host (str): The host URL of Langflow.
|
44
|
+
port (int): The port number of Langflow.
|
45
|
+
flow_id (UUID): The ID of the flow to which the file belongs.
|
46
|
+
components (str): List of component IDs or names that need the file.
|
47
|
+
tweaks (dict): A dictionary of tweaks to be applied to the file.
|
48
|
+
|
49
|
+
Returns:
|
50
|
+
dict: A dictionary containing the file path and any tweaks that were applied.
|
51
|
+
|
52
|
+
Raises:
|
53
|
+
UploadError: If an error occurs during the upload process.
|
54
|
+
"""
|
55
|
+
try:
|
56
|
+
response = upload(file_path, host, flow_id)
|
57
|
+
except Exception as e:
|
58
|
+
msg = f"Error uploading file: {e}"
|
59
|
+
raise UploadError(msg) from e
|
60
|
+
|
61
|
+
if not tweaks:
|
62
|
+
tweaks = {}
|
63
|
+
if response["file_path"]:
|
64
|
+
for component in components:
|
65
|
+
if isinstance(component, str):
|
66
|
+
tweaks[component] = {"path": response["file_path"]}
|
67
|
+
else:
|
68
|
+
msg = f"Error uploading file: component ID or name must be a string. Got {type(component)}"
|
69
|
+
raise UploadError(msg)
|
70
|
+
return tweaks
|
71
|
+
|
72
|
+
msg = "Error uploading file"
|
73
|
+
raise UploadError(msg)
|
74
|
+
|
75
|
+
|
76
|
+
def replace_tweaks_with_env(tweaks: dict, env_vars: dict) -> dict:
|
77
|
+
"""Replace keys in the tweaks dictionary with their corresponding environment variable values.
|
78
|
+
|
79
|
+
This function recursively traverses the tweaks dictionary and replaces any string keys
|
80
|
+
with their values from the provided environment variables. If a key's value is a dictionary,
|
81
|
+
the function will call itself to handle nested dictionaries.
|
82
|
+
|
83
|
+
Args:
|
84
|
+
tweaks (dict): A dictionary containing keys that may correspond to environment variable names.
|
85
|
+
env_vars (dict): A dictionary of environment variables where keys are variable names
|
86
|
+
and values are their corresponding values.
|
87
|
+
|
88
|
+
Returns:
|
89
|
+
dict: The updated tweaks dictionary with keys replaced by their environment variable values.
|
90
|
+
"""
|
91
|
+
for key, value in tweaks.items():
|
92
|
+
if isinstance(value, dict):
|
93
|
+
# Recursively replace in nested dictionaries
|
94
|
+
tweaks[key] = replace_tweaks_with_env(value, env_vars)
|
95
|
+
elif isinstance(value, str):
|
96
|
+
env_value = env_vars.get(value) # Get the value from the provided environment variables
|
97
|
+
if env_value is not None:
|
98
|
+
tweaks[key] = env_value
|
99
|
+
return tweaks
|