lfx-nightly 0.1.11.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +268 -0
- lfx/base/agents/callback.py +130 -0
- lfx/base/agents/context.py +109 -0
- lfx/base/agents/crewai/__init__.py +0 -0
- lfx/base/agents/crewai/crew.py +231 -0
- lfx/base/agents/crewai/tasks.py +12 -0
- lfx/base/agents/default_prompts.py +23 -0
- lfx/base/agents/errors.py +15 -0
- lfx/base/agents/events.py +346 -0
- lfx/base/agents/utils.py +205 -0
- lfx/base/astra_assistants/__init__.py +0 -0
- lfx/base/astra_assistants/util.py +171 -0
- lfx/base/chains/__init__.py +0 -0
- lfx/base/chains/model.py +19 -0
- lfx/base/composio/__init__.py +0 -0
- lfx/base/composio/composio_base.py +1291 -0
- lfx/base/compressors/__init__.py +0 -0
- lfx/base/compressors/model.py +60 -0
- lfx/base/constants.py +46 -0
- lfx/base/curl/__init__.py +0 -0
- lfx/base/curl/parse.py +188 -0
- lfx/base/data/__init__.py +5 -0
- lfx/base/data/base_file.py +685 -0
- lfx/base/data/docling_utils.py +245 -0
- lfx/base/data/utils.py +198 -0
- lfx/base/document_transformers/__init__.py +0 -0
- lfx/base/document_transformers/model.py +43 -0
- lfx/base/embeddings/__init__.py +0 -0
- lfx/base/embeddings/aiml_embeddings.py +62 -0
- lfx/base/embeddings/model.py +26 -0
- lfx/base/flow_processing/__init__.py +0 -0
- lfx/base/flow_processing/utils.py +86 -0
- lfx/base/huggingface/__init__.py +0 -0
- lfx/base/huggingface/model_bridge.py +133 -0
- lfx/base/io/__init__.py +0 -0
- lfx/base/io/chat.py +20 -0
- lfx/base/io/text.py +22 -0
- lfx/base/langchain_utilities/__init__.py +0 -0
- lfx/base/langchain_utilities/model.py +35 -0
- lfx/base/langchain_utilities/spider_constants.py +1 -0
- lfx/base/langwatch/__init__.py +0 -0
- lfx/base/langwatch/utils.py +18 -0
- lfx/base/mcp/__init__.py +0 -0
- lfx/base/mcp/constants.py +2 -0
- lfx/base/mcp/util.py +1398 -0
- lfx/base/memory/__init__.py +0 -0
- lfx/base/memory/memory.py +49 -0
- lfx/base/memory/model.py +38 -0
- lfx/base/models/__init__.py +3 -0
- lfx/base/models/aiml_constants.py +51 -0
- lfx/base/models/anthropic_constants.py +47 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/groq_constants.py +134 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +307 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +8 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +49 -0
- lfx/base/models/openai_constants.py +122 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/processing/__init__.py +0 -0
- lfx/base/prompts/__init__.py +0 -0
- lfx/base/prompts/api_utils.py +224 -0
- lfx/base/prompts/utils.py +61 -0
- lfx/base/textsplitters/__init__.py +0 -0
- lfx/base/textsplitters/model.py +28 -0
- lfx/base/tools/__init__.py +0 -0
- lfx/base/tools/base.py +26 -0
- lfx/base/tools/component_tool.py +325 -0
- lfx/base/tools/constants.py +49 -0
- lfx/base/tools/flow_tool.py +132 -0
- lfx/base/tools/run_flow.py +224 -0
- lfx/base/vectorstores/__init__.py +0 -0
- lfx/base/vectorstores/model.py +193 -0
- lfx/base/vectorstores/utils.py +22 -0
- lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
- lfx/cli/__init__.py +5 -0
- lfx/cli/commands.py +319 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +441 -0
- lfx/cli/script_loader.py +247 -0
- lfx/cli/serve_app.py +546 -0
- lfx/cli/validation.py +69 -0
- lfx/components/FAISS/__init__.py +34 -0
- lfx/components/FAISS/faiss.py +111 -0
- lfx/components/Notion/__init__.py +19 -0
- lfx/components/Notion/add_content_to_page.py +269 -0
- lfx/components/Notion/create_page.py +94 -0
- lfx/components/Notion/list_database_properties.py +68 -0
- lfx/components/Notion/list_pages.py +122 -0
- lfx/components/Notion/list_users.py +77 -0
- lfx/components/Notion/page_content_viewer.py +93 -0
- lfx/components/Notion/search.py +111 -0
- lfx/components/Notion/update_page_property.py +114 -0
- lfx/components/__init__.py +411 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/agents/__init__.py +34 -0
- lfx/components/agents/agent.py +558 -0
- lfx/components/agents/mcp_component.py +501 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +112 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +124 -0
- lfx/components/amazon/s3_bucket_uploader.py +211 -0
- lfx/components/anthropic/__init__.py +34 -0
- lfx/components/anthropic/anthropic.py +187 -0
- lfx/components/apify/__init__.py +5 -0
- lfx/components/apify/apify_actor.py +325 -0
- lfx/components/arxiv/__init__.py +3 -0
- lfx/components/arxiv/arxiv.py +163 -0
- lfx/components/assemblyai/__init__.py +46 -0
- lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- lfx/components/assemblyai/assemblyai_lemur.py +183 -0
- lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
- lfx/components/azure/__init__.py +37 -0
- lfx/components/azure/azure_openai.py +95 -0
- lfx/components/azure/azure_openai_embeddings.py +83 -0
- lfx/components/baidu/__init__.py +32 -0
- lfx/components/baidu/baidu_qianfan_chat.py +113 -0
- lfx/components/bing/__init__.py +3 -0
- lfx/components/bing/bing_search_api.py +61 -0
- lfx/components/cassandra/__init__.py +40 -0
- lfx/components/cassandra/cassandra.py +264 -0
- lfx/components/cassandra/cassandra_chat.py +92 -0
- lfx/components/cassandra/cassandra_graph.py +238 -0
- lfx/components/chains/__init__.py +3 -0
- lfx/components/chroma/__init__.py +34 -0
- lfx/components/chroma/chroma.py +167 -0
- lfx/components/cleanlab/__init__.py +40 -0
- lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
- lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- lfx/components/cleanlab/cleanlab_remediator.py +131 -0
- lfx/components/clickhouse/__init__.py +34 -0
- lfx/components/clickhouse/clickhouse.py +135 -0
- lfx/components/cloudflare/__init__.py +32 -0
- lfx/components/cloudflare/cloudflare.py +81 -0
- lfx/components/cohere/__init__.py +40 -0
- lfx/components/cohere/cohere_embeddings.py +81 -0
- lfx/components/cohere/cohere_models.py +46 -0
- lfx/components/cohere/cohere_rerank.py +51 -0
- lfx/components/composio/__init__.py +74 -0
- lfx/components/composio/composio_api.py +268 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/slack_composio.py +582 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/youtube_composio.py +11 -0
- lfx/components/confluence/__init__.py +3 -0
- lfx/components/confluence/confluence.py +84 -0
- lfx/components/couchbase/__init__.py +34 -0
- lfx/components/couchbase/couchbase.py +102 -0
- lfx/components/crewai/__init__.py +49 -0
- lfx/components/crewai/crewai.py +107 -0
- lfx/components/crewai/hierarchical_crew.py +46 -0
- lfx/components/crewai/hierarchical_task.py +44 -0
- lfx/components/crewai/sequential_crew.py +52 -0
- lfx/components/crewai/sequential_task.py +73 -0
- lfx/components/crewai/sequential_task_agent.py +143 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +64 -0
- lfx/components/data/api_request.py +544 -0
- lfx/components/data/csv_to_data.py +95 -0
- lfx/components/data/directory.py +113 -0
- lfx/components/data/file.py +577 -0
- lfx/components/data/json_to_data.py +98 -0
- lfx/components/data/news_search.py +164 -0
- lfx/components/data/rss.py +69 -0
- lfx/components/data/sql_executor.py +101 -0
- lfx/components/data/url.py +311 -0
- lfx/components/data/web_search.py +112 -0
- lfx/components/data/webhook.py +56 -0
- lfx/components/datastax/__init__.py +70 -0
- lfx/components/datastax/astra_assistant_manager.py +306 -0
- lfx/components/datastax/astra_db.py +75 -0
- lfx/components/datastax/astra_vectorize.py +124 -0
- lfx/components/datastax/astradb.py +1285 -0
- lfx/components/datastax/astradb_cql.py +314 -0
- lfx/components/datastax/astradb_graph.py +330 -0
- lfx/components/datastax/astradb_tool.py +414 -0
- lfx/components/datastax/astradb_vectorstore.py +1285 -0
- lfx/components/datastax/cassandra.py +92 -0
- lfx/components/datastax/create_assistant.py +58 -0
- lfx/components/datastax/create_thread.py +32 -0
- lfx/components/datastax/dotenv.py +35 -0
- lfx/components/datastax/get_assistant.py +37 -0
- lfx/components/datastax/getenvvar.py +30 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +314 -0
- lfx/components/datastax/list_assistants.py +25 -0
- lfx/components/datastax/run.py +89 -0
- lfx/components/deactivated/__init__.py +15 -0
- lfx/components/deactivated/amazon_kendra.py +66 -0
- lfx/components/deactivated/chat_litellm_model.py +158 -0
- lfx/components/deactivated/code_block_extractor.py +26 -0
- lfx/components/deactivated/documents_to_data.py +22 -0
- lfx/components/deactivated/embed.py +16 -0
- lfx/components/deactivated/extract_key_from_data.py +46 -0
- lfx/components/deactivated/json_document_builder.py +57 -0
- lfx/components/deactivated/list_flows.py +20 -0
- lfx/components/deactivated/mcp_sse.py +61 -0
- lfx/components/deactivated/mcp_stdio.py +62 -0
- lfx/components/deactivated/merge_data.py +93 -0
- lfx/components/deactivated/message.py +37 -0
- lfx/components/deactivated/metal.py +54 -0
- lfx/components/deactivated/multi_query.py +59 -0
- lfx/components/deactivated/retriever.py +43 -0
- lfx/components/deactivated/selective_passthrough.py +77 -0
- lfx/components/deactivated/should_run_next.py +40 -0
- lfx/components/deactivated/split_text.py +63 -0
- lfx/components/deactivated/store_message.py +24 -0
- lfx/components/deactivated/sub_flow.py +124 -0
- lfx/components/deactivated/vectara_self_query.py +76 -0
- lfx/components/deactivated/vector_store.py +24 -0
- lfx/components/deepseek/__init__.py +34 -0
- lfx/components/deepseek/deepseek.py +136 -0
- lfx/components/docling/__init__.py +43 -0
- lfx/components/docling/chunk_docling_document.py +186 -0
- lfx/components/docling/docling_inline.py +231 -0
- lfx/components/docling/docling_remote.py +193 -0
- lfx/components/docling/export_docling_document.py +117 -0
- lfx/components/documentloaders/__init__.py +3 -0
- lfx/components/duckduckgo/__init__.py +3 -0
- lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- lfx/components/elastic/__init__.py +37 -0
- lfx/components/elastic/elasticsearch.py +267 -0
- lfx/components/elastic/opensearch.py +243 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +76 -0
- lfx/components/embeddings/text_embedder.py +64 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/firecrawl/__init__.py +43 -0
- lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
- lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
- lfx/components/firecrawl/firecrawl_map_api.py +89 -0
- lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
- lfx/components/git/__init__.py +4 -0
- lfx/components/git/git.py +262 -0
- lfx/components/git/gitextractor.py +196 -0
- lfx/components/glean/__init__.py +3 -0
- lfx/components/glean/glean_search_api.py +173 -0
- lfx/components/google/__init__.py +17 -0
- lfx/components/google/gmail.py +192 -0
- lfx/components/google/google_bq_sql_executor.py +157 -0
- lfx/components/google/google_drive.py +92 -0
- lfx/components/google/google_drive_search.py +152 -0
- lfx/components/google/google_generative_ai.py +147 -0
- lfx/components/google/google_generative_ai_embeddings.py +141 -0
- lfx/components/google/google_oauth_token.py +89 -0
- lfx/components/google/google_search_api_core.py +68 -0
- lfx/components/google/google_serper_api_core.py +74 -0
- lfx/components/groq/__init__.py +34 -0
- lfx/components/groq/groq.py +136 -0
- lfx/components/helpers/__init__.py +52 -0
- lfx/components/helpers/calculator_core.py +89 -0
- lfx/components/helpers/create_list.py +40 -0
- lfx/components/helpers/current_date.py +42 -0
- lfx/components/helpers/id_generator.py +42 -0
- lfx/components/helpers/memory.py +251 -0
- lfx/components/helpers/output_parser.py +45 -0
- lfx/components/helpers/store_message.py +90 -0
- lfx/components/homeassistant/__init__.py +7 -0
- lfx/components/homeassistant/home_assistant_control.py +152 -0
- lfx/components/homeassistant/list_home_assistant_states.py +137 -0
- lfx/components/huggingface/__init__.py +37 -0
- lfx/components/huggingface/huggingface.py +197 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +203 -0
- lfx/components/ibm/watsonx_embeddings.py +135 -0
- lfx/components/icosacomputing/__init__.py +5 -0
- lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
- lfx/components/input_output/__init__.py +38 -0
- lfx/components/input_output/chat.py +120 -0
- lfx/components/input_output/chat_output.py +200 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/jigsawstack/__init__.py +23 -0
- lfx/components/jigsawstack/ai_scrape.py +126 -0
- lfx/components/jigsawstack/ai_web_search.py +136 -0
- lfx/components/jigsawstack/file_read.py +115 -0
- lfx/components/jigsawstack/file_upload.py +94 -0
- lfx/components/jigsawstack/image_generation.py +205 -0
- lfx/components/jigsawstack/nsfw.py +60 -0
- lfx/components/jigsawstack/object_detection.py +124 -0
- lfx/components/jigsawstack/sentiment.py +112 -0
- lfx/components/jigsawstack/text_to_sql.py +90 -0
- lfx/components/jigsawstack/text_translate.py +77 -0
- lfx/components/jigsawstack/vocr.py +107 -0
- lfx/components/langchain_utilities/__init__.py +109 -0
- lfx/components/langchain_utilities/character.py +53 -0
- lfx/components/langchain_utilities/conversation.py +59 -0
- lfx/components/langchain_utilities/csv_agent.py +107 -0
- lfx/components/langchain_utilities/fake_embeddings.py +26 -0
- lfx/components/langchain_utilities/html_link_extractor.py +35 -0
- lfx/components/langchain_utilities/json_agent.py +45 -0
- lfx/components/langchain_utilities/langchain_hub.py +126 -0
- lfx/components/langchain_utilities/language_recursive.py +49 -0
- lfx/components/langchain_utilities/language_semantic.py +138 -0
- lfx/components/langchain_utilities/llm_checker.py +39 -0
- lfx/components/langchain_utilities/llm_math.py +42 -0
- lfx/components/langchain_utilities/natural_language.py +61 -0
- lfx/components/langchain_utilities/openai_tools.py +53 -0
- lfx/components/langchain_utilities/openapi.py +48 -0
- lfx/components/langchain_utilities/recursive_character.py +60 -0
- lfx/components/langchain_utilities/retrieval_qa.py +83 -0
- lfx/components/langchain_utilities/runnable_executor.py +137 -0
- lfx/components/langchain_utilities/self_query.py +80 -0
- lfx/components/langchain_utilities/spider.py +142 -0
- lfx/components/langchain_utilities/sql.py +40 -0
- lfx/components/langchain_utilities/sql_database.py +35 -0
- lfx/components/langchain_utilities/sql_generator.py +78 -0
- lfx/components/langchain_utilities/tool_calling.py +59 -0
- lfx/components/langchain_utilities/vector_store_info.py +49 -0
- lfx/components/langchain_utilities/vector_store_router.py +33 -0
- lfx/components/langchain_utilities/xml_agent.py +71 -0
- lfx/components/langwatch/__init__.py +3 -0
- lfx/components/langwatch/langwatch.py +278 -0
- lfx/components/link_extractors/__init__.py +3 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +129 -0
- lfx/components/logic/__init__.py +52 -0
- lfx/components/logic/conditional_router.py +171 -0
- lfx/components/logic/data_conditional_router.py +125 -0
- lfx/components/logic/flow_tool.py +110 -0
- lfx/components/logic/listen.py +29 -0
- lfx/components/logic/loop.py +125 -0
- lfx/components/logic/notify.py +88 -0
- lfx/components/logic/pass_message.py +35 -0
- lfx/components/logic/run_flow.py +71 -0
- lfx/components/logic/sub_flow.py +114 -0
- lfx/components/maritalk/__init__.py +32 -0
- lfx/components/maritalk/maritalk.py +52 -0
- lfx/components/mem0/__init__.py +3 -0
- lfx/components/mem0/mem0_chat_memory.py +136 -0
- lfx/components/milvus/__init__.py +34 -0
- lfx/components/milvus/milvus.py +115 -0
- lfx/components/mistral/__init__.py +37 -0
- lfx/components/mistral/mistral.py +114 -0
- lfx/components/mistral/mistral_embeddings.py +58 -0
- lfx/components/models/__init__.py +34 -0
- lfx/components/models/embedding_model.py +114 -0
- lfx/components/models/language_model.py +144 -0
- lfx/components/mongodb/__init__.py +34 -0
- lfx/components/mongodb/mongodb_atlas.py +213 -0
- lfx/components/needle/__init__.py +3 -0
- lfx/components/needle/needle.py +104 -0
- lfx/components/notdiamond/__init__.py +34 -0
- lfx/components/notdiamond/notdiamond.py +228 -0
- lfx/components/novita/__init__.py +32 -0
- lfx/components/novita/novita.py +130 -0
- lfx/components/nvidia/__init__.py +57 -0
- lfx/components/nvidia/nvidia.py +157 -0
- lfx/components/nvidia/nvidia_embedding.py +77 -0
- lfx/components/nvidia/nvidia_ingest.py +317 -0
- lfx/components/nvidia/nvidia_rerank.py +63 -0
- lfx/components/nvidia/system_assist.py +65 -0
- lfx/components/olivya/__init__.py +3 -0
- lfx/components/olivya/olivya.py +116 -0
- lfx/components/ollama/__init__.py +37 -0
- lfx/components/ollama/ollama.py +330 -0
- lfx/components/ollama/ollama_embeddings.py +106 -0
- lfx/components/openai/__init__.py +37 -0
- lfx/components/openai/openai.py +100 -0
- lfx/components/openai/openai_chat_model.py +176 -0
- lfx/components/openrouter/__init__.py +32 -0
- lfx/components/openrouter/openrouter.py +202 -0
- lfx/components/output_parsers/__init__.py +3 -0
- lfx/components/perplexity/__init__.py +34 -0
- lfx/components/perplexity/perplexity.py +75 -0
- lfx/components/pgvector/__init__.py +34 -0
- lfx/components/pgvector/pgvector.py +72 -0
- lfx/components/pinecone/__init__.py +34 -0
- lfx/components/pinecone/pinecone.py +134 -0
- lfx/components/processing/__init__.py +117 -0
- lfx/components/processing/alter_metadata.py +108 -0
- lfx/components/processing/batch_run.py +205 -0
- lfx/components/processing/combine_text.py +39 -0
- lfx/components/processing/converter.py +159 -0
- lfx/components/processing/create_data.py +110 -0
- lfx/components/processing/data_operations.py +438 -0
- lfx/components/processing/data_to_dataframe.py +70 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/extract_key.py +53 -0
- lfx/components/processing/filter_data.py +42 -0
- lfx/components/processing/filter_data_values.py +88 -0
- lfx/components/processing/json_cleaner.py +103 -0
- lfx/components/processing/lambda_filter.py +154 -0
- lfx/components/processing/llm_router.py +499 -0
- lfx/components/processing/merge_data.py +90 -0
- lfx/components/processing/message_to_data.py +36 -0
- lfx/components/processing/parse_data.py +70 -0
- lfx/components/processing/parse_dataframe.py +68 -0
- lfx/components/processing/parse_json_data.py +90 -0
- lfx/components/processing/parser.py +143 -0
- lfx/components/processing/prompt.py +67 -0
- lfx/components/processing/python_repl_core.py +98 -0
- lfx/components/processing/regex.py +82 -0
- lfx/components/processing/save_file.py +225 -0
- lfx/components/processing/select_data.py +48 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/structured_output.py +202 -0
- lfx/components/processing/update_data.py +160 -0
- lfx/components/prototypes/__init__.py +34 -0
- lfx/components/prototypes/python_function.py +73 -0
- lfx/components/qdrant/__init__.py +34 -0
- lfx/components/qdrant/qdrant.py +109 -0
- lfx/components/redis/__init__.py +37 -0
- lfx/components/redis/redis.py +89 -0
- lfx/components/redis/redis_chat.py +43 -0
- lfx/components/sambanova/__init__.py +32 -0
- lfx/components/sambanova/sambanova.py +84 -0
- lfx/components/scrapegraph/__init__.py +40 -0
- lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- lfx/components/searchapi/__init__.py +34 -0
- lfx/components/searchapi/search.py +79 -0
- lfx/components/serpapi/__init__.py +3 -0
- lfx/components/serpapi/serp.py +115 -0
- lfx/components/supabase/__init__.py +34 -0
- lfx/components/supabase/supabase.py +76 -0
- lfx/components/tavily/__init__.py +4 -0
- lfx/components/tavily/tavily_extract.py +117 -0
- lfx/components/tavily/tavily_search.py +212 -0
- lfx/components/textsplitters/__init__.py +3 -0
- lfx/components/toolkits/__init__.py +3 -0
- lfx/components/tools/__init__.py +72 -0
- lfx/components/tools/calculator.py +108 -0
- lfx/components/tools/google_search_api.py +45 -0
- lfx/components/tools/google_serper_api.py +115 -0
- lfx/components/tools/python_code_structured_tool.py +327 -0
- lfx/components/tools/python_repl.py +97 -0
- lfx/components/tools/search_api.py +87 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +119 -0
- lfx/components/tools/tavily_search_tool.py +344 -0
- lfx/components/tools/wikidata_api.py +102 -0
- lfx/components/tools/wikipedia_api.py +49 -0
- lfx/components/tools/yahoo_finance.py +129 -0
- lfx/components/twelvelabs/__init__.py +52 -0
- lfx/components/twelvelabs/convert_astra_results.py +84 -0
- lfx/components/twelvelabs/pegasus_index.py +311 -0
- lfx/components/twelvelabs/split_video.py +291 -0
- lfx/components/twelvelabs/text_embeddings.py +57 -0
- lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- lfx/components/twelvelabs/video_embeddings.py +100 -0
- lfx/components/twelvelabs/video_file.py +179 -0
- lfx/components/unstructured/__init__.py +3 -0
- lfx/components/unstructured/unstructured.py +121 -0
- lfx/components/upstash/__init__.py +34 -0
- lfx/components/upstash/upstash.py +124 -0
- lfx/components/vectara/__init__.py +37 -0
- lfx/components/vectara/vectara.py +97 -0
- lfx/components/vectara/vectara_rag.py +164 -0
- lfx/components/vectorstores/__init__.py +40 -0
- lfx/components/vectorstores/astradb.py +1285 -0
- lfx/components/vectorstores/astradb_graph.py +319 -0
- lfx/components/vectorstores/cassandra.py +264 -0
- lfx/components/vectorstores/cassandra_graph.py +238 -0
- lfx/components/vectorstores/chroma.py +167 -0
- lfx/components/vectorstores/clickhouse.py +135 -0
- lfx/components/vectorstores/couchbase.py +102 -0
- lfx/components/vectorstores/elasticsearch.py +267 -0
- lfx/components/vectorstores/faiss.py +111 -0
- lfx/components/vectorstores/graph_rag.py +141 -0
- lfx/components/vectorstores/hcd.py +314 -0
- lfx/components/vectorstores/local_db.py +261 -0
- lfx/components/vectorstores/milvus.py +115 -0
- lfx/components/vectorstores/mongodb_atlas.py +213 -0
- lfx/components/vectorstores/opensearch.py +243 -0
- lfx/components/vectorstores/pgvector.py +72 -0
- lfx/components/vectorstores/pinecone.py +134 -0
- lfx/components/vectorstores/qdrant.py +109 -0
- lfx/components/vectorstores/supabase.py +76 -0
- lfx/components/vectorstores/upstash.py +124 -0
- lfx/components/vectorstores/vectara.py +97 -0
- lfx/components/vectorstores/vectara_rag.py +164 -0
- lfx/components/vectorstores/weaviate.py +89 -0
- lfx/components/vertexai/__init__.py +37 -0
- lfx/components/vertexai/vertexai.py +71 -0
- lfx/components/vertexai/vertexai_embeddings.py +67 -0
- lfx/components/weaviate/__init__.py +34 -0
- lfx/components/weaviate/weaviate.py +89 -0
- lfx/components/wikipedia/__init__.py +4 -0
- lfx/components/wikipedia/wikidata.py +86 -0
- lfx/components/wikipedia/wikipedia.py +53 -0
- lfx/components/wolframalpha/__init__.py +3 -0
- lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
- lfx/components/xai/__init__.py +32 -0
- lfx/components/xai/xai.py +167 -0
- lfx/components/yahoosearch/__init__.py +3 -0
- lfx/components/yahoosearch/yahoo.py +137 -0
- lfx/components/youtube/__init__.py +52 -0
- lfx/components/youtube/channel.py +227 -0
- lfx/components/youtube/comments.py +231 -0
- lfx/components/youtube/playlist.py +33 -0
- lfx/components/youtube/search.py +120 -0
- lfx/components/youtube/trending.py +285 -0
- lfx/components/youtube/video_details.py +263 -0
- lfx/components/youtube/youtube_transcripts.py +118 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +44 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +86 -0
- lfx/custom/code_parser/__init__.py +3 -0
- lfx/custom/code_parser/code_parser.py +361 -0
- lfx/custom/custom_component/__init__.py +0 -0
- lfx/custom/custom_component/base_component.py +128 -0
- lfx/custom/custom_component/component.py +1808 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +588 -0
- lfx/custom/dependency_analyzer.py +165 -0
- lfx/custom/directory_reader/__init__.py +3 -0
- lfx/custom/directory_reader/directory_reader.py +359 -0
- lfx/custom/directory_reader/utils.py +171 -0
- lfx/custom/eval.py +12 -0
- lfx/custom/schema.py +32 -0
- lfx/custom/tree_visitor.py +21 -0
- lfx/custom/utils.py +877 -0
- lfx/custom/validate.py +488 -0
- lfx/events/__init__.py +1 -0
- lfx/events/event_manager.py +110 -0
- lfx/exceptions/__init__.py +0 -0
- lfx/exceptions/component.py +15 -0
- lfx/field_typing/__init__.py +91 -0
- lfx/field_typing/constants.py +215 -0
- lfx/field_typing/range_spec.py +35 -0
- lfx/graph/__init__.py +6 -0
- lfx/graph/edge/__init__.py +0 -0
- lfx/graph/edge/base.py +277 -0
- lfx/graph/edge/schema.py +119 -0
- lfx/graph/edge/utils.py +0 -0
- lfx/graph/graph/__init__.py +0 -0
- lfx/graph/graph/ascii.py +202 -0
- lfx/graph/graph/base.py +2238 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +52 -0
- lfx/graph/graph/state_model.py +66 -0
- lfx/graph/graph/utils.py +1024 -0
- lfx/graph/schema.py +75 -0
- lfx/graph/state/__init__.py +0 -0
- lfx/graph/state/model.py +237 -0
- lfx/graph/utils.py +200 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +823 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +264 -0
- lfx/graph/vertex/schema.py +26 -0
- lfx/graph/vertex/utils.py +19 -0
- lfx/graph/vertex/vertex_types.py +489 -0
- lfx/helpers/__init__.py +1 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +194 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +328 -0
- lfx/inputs/inputs.py +714 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +489 -0
- lfx/interface/importing/__init__.py +5 -0
- lfx/interface/importing/utils.py +39 -0
- lfx/interface/initialize/__init__.py +3 -0
- lfx/interface/initialize/loading.py +224 -0
- lfx/interface/listing.py +26 -0
- lfx/interface/run.py +16 -0
- lfx/interface/utils.py +111 -0
- lfx/io/__init__.py +63 -0
- lfx/io/schema.py +289 -0
- lfx/load/__init__.py +8 -0
- lfx/load/load.py +256 -0
- lfx/load/utils.py +99 -0
- lfx/log/__init__.py +5 -0
- lfx/log/logger.py +385 -0
- lfx/memory/__init__.py +90 -0
- lfx/memory/stubs.py +283 -0
- lfx/processing/__init__.py +1 -0
- lfx/processing/process.py +238 -0
- lfx/processing/utils.py +25 -0
- lfx/py.typed +0 -0
- lfx/schema/__init__.py +66 -0
- lfx/schema/artifact.py +83 -0
- lfx/schema/content_block.py +62 -0
- lfx/schema/content_types.py +91 -0
- lfx/schema/data.py +308 -0
- lfx/schema/dataframe.py +210 -0
- lfx/schema/dotdict.py +74 -0
- lfx/schema/encoders.py +13 -0
- lfx/schema/graph.py +47 -0
- lfx/schema/image.py +131 -0
- lfx/schema/json_schema.py +141 -0
- lfx/schema/log.py +61 -0
- lfx/schema/message.py +473 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +171 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +140 -0
- lfx/schema/validators.py +114 -0
- lfx/serialization/__init__.py +5 -0
- lfx/serialization/constants.py +2 -0
- lfx/serialization/serialization.py +314 -0
- lfx/services/__init__.py +23 -0
- lfx/services/base.py +28 -0
- lfx/services/cache/__init__.py +6 -0
- lfx/services/cache/base.py +183 -0
- lfx/services/cache/service.py +166 -0
- lfx/services/cache/utils.py +169 -0
- lfx/services/chat/__init__.py +1 -0
- lfx/services/chat/config.py +2 -0
- lfx/services/chat/schema.py +10 -0
- lfx/services/deps.py +129 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +172 -0
- lfx/services/schema.py +20 -0
- lfx/services/session.py +82 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +130 -0
- lfx/services/settings/base.py +539 -0
- lfx/services/settings/constants.py +31 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +12 -0
- lfx/services/settings/service.py +35 -0
- lfx/services/settings/utils.py +40 -0
- lfx/services/shared_component_cache/__init__.py +1 -0
- lfx/services/shared_component_cache/factory.py +30 -0
- lfx/services/shared_component_cache/service.py +9 -0
- lfx/services/storage/__init__.py +5 -0
- lfx/services/storage/local.py +155 -0
- lfx/services/storage/service.py +54 -0
- lfx/services/tracing/__init__.py +1 -0
- lfx/services/tracing/service.py +21 -0
- lfx/settings.py +6 -0
- lfx/template/__init__.py +6 -0
- lfx/template/field/__init__.py +0 -0
- lfx/template/field/base.py +257 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +212 -0
- lfx/template/frontend_node/constants.py +65 -0
- lfx/template/frontend_node/custom_components.py +79 -0
- lfx/template/template/__init__.py +0 -0
- lfx/template/template/base.py +100 -0
- lfx/template/utils.py +217 -0
- lfx/type_extraction/__init__.py +19 -0
- lfx/type_extraction/type_extraction.py +75 -0
- lfx/type_extraction.py +80 -0
- lfx/utils/__init__.py +1 -0
- lfx/utils/async_helpers.py +42 -0
- lfx/utils/component_utils.py +154 -0
- lfx/utils/concurrency.py +60 -0
- lfx/utils/connection_string_parser.py +11 -0
- lfx/utils/constants.py +205 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +28 -0
- lfx/utils/image.py +73 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/util.py +481 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
- lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
- lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
- lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,215 @@
|
|
1
|
+
"""Constants for field typing used throughout lfx package."""
|
2
|
+
|
3
|
+
import importlib.util
|
4
|
+
from collections.abc import Callable
|
5
|
+
from typing import Text, TypeAlias, TypeVar
|
6
|
+
|
7
|
+
# Safe imports that don't create circular dependencies
|
8
|
+
try:
|
9
|
+
from langchain.agents.agent import AgentExecutor
|
10
|
+
from langchain.chains.base import Chain
|
11
|
+
from langchain.memory.chat_memory import BaseChatMemory
|
12
|
+
from langchain_core.chat_history import BaseChatMessageHistory
|
13
|
+
from langchain_core.document_loaders import BaseLoader
|
14
|
+
from langchain_core.documents import Document
|
15
|
+
from langchain_core.documents.compressor import BaseDocumentCompressor
|
16
|
+
from langchain_core.embeddings import Embeddings
|
17
|
+
from langchain_core.language_models import BaseLanguageModel, BaseLLM
|
18
|
+
from langchain_core.language_models.chat_models import BaseChatModel
|
19
|
+
from langchain_core.memory import BaseMemory
|
20
|
+
from langchain_core.output_parsers import BaseLLMOutputParser, BaseOutputParser
|
21
|
+
from langchain_core.prompts import BasePromptTemplate, ChatPromptTemplate, PromptTemplate
|
22
|
+
from langchain_core.retrievers import BaseRetriever
|
23
|
+
from langchain_core.tools import BaseTool, Tool
|
24
|
+
from langchain_core.vectorstores import VectorStore, VectorStoreRetriever
|
25
|
+
from langchain_text_splitters import TextSplitter
|
26
|
+
except ImportError:
|
27
|
+
# Create stub types if langchain is not available
|
28
|
+
class AgentExecutor:
|
29
|
+
pass
|
30
|
+
|
31
|
+
class Chain:
|
32
|
+
pass
|
33
|
+
|
34
|
+
class BaseChatMemory:
|
35
|
+
pass
|
36
|
+
|
37
|
+
class BaseChatMessageHistory:
|
38
|
+
pass
|
39
|
+
|
40
|
+
class BaseLoader:
|
41
|
+
pass
|
42
|
+
|
43
|
+
class Document:
|
44
|
+
pass
|
45
|
+
|
46
|
+
class BaseDocumentCompressor:
|
47
|
+
pass
|
48
|
+
|
49
|
+
class Embeddings:
|
50
|
+
pass
|
51
|
+
|
52
|
+
class BaseLanguageModel:
|
53
|
+
pass
|
54
|
+
|
55
|
+
class BaseLLM:
|
56
|
+
pass
|
57
|
+
|
58
|
+
class BaseChatModel:
|
59
|
+
pass
|
60
|
+
|
61
|
+
class BaseMemory:
|
62
|
+
pass
|
63
|
+
|
64
|
+
class BaseLLMOutputParser:
|
65
|
+
pass
|
66
|
+
|
67
|
+
class BaseOutputParser:
|
68
|
+
pass
|
69
|
+
|
70
|
+
class BasePromptTemplate:
|
71
|
+
pass
|
72
|
+
|
73
|
+
class ChatPromptTemplate:
|
74
|
+
pass
|
75
|
+
|
76
|
+
class PromptTemplate:
|
77
|
+
pass
|
78
|
+
|
79
|
+
class BaseRetriever:
|
80
|
+
pass
|
81
|
+
|
82
|
+
class BaseTool:
|
83
|
+
pass
|
84
|
+
|
85
|
+
class Tool:
|
86
|
+
pass
|
87
|
+
|
88
|
+
class VectorStore:
|
89
|
+
pass
|
90
|
+
|
91
|
+
class VectorStoreRetriever:
|
92
|
+
pass
|
93
|
+
|
94
|
+
class TextSplitter:
|
95
|
+
pass
|
96
|
+
|
97
|
+
|
98
|
+
# Import lfx schema types (avoid circular deps)
|
99
|
+
from lfx.schema.data import Data
|
100
|
+
|
101
|
+
# Type aliases
|
102
|
+
NestedDict: TypeAlias = dict[str, str | dict]
|
103
|
+
LanguageModel = TypeVar("LanguageModel", BaseLanguageModel, BaseLLM, BaseChatModel)
|
104
|
+
ToolEnabledLanguageModel = TypeVar("ToolEnabledLanguageModel", BaseLanguageModel, BaseLLM, BaseChatModel)
|
105
|
+
Memory = TypeVar("Memory", bound=BaseChatMessageHistory)
|
106
|
+
|
107
|
+
Retriever = TypeVar(
|
108
|
+
"Retriever",
|
109
|
+
BaseRetriever,
|
110
|
+
VectorStoreRetriever,
|
111
|
+
)
|
112
|
+
OutputParser = TypeVar(
|
113
|
+
"OutputParser",
|
114
|
+
BaseOutputParser,
|
115
|
+
BaseLLMOutputParser,
|
116
|
+
)
|
117
|
+
|
118
|
+
|
119
|
+
class Object:
|
120
|
+
"""Generic object type for custom components."""
|
121
|
+
|
122
|
+
|
123
|
+
class Code:
|
124
|
+
"""Code type for custom components."""
|
125
|
+
|
126
|
+
|
127
|
+
# Langchain base types mapping
|
128
|
+
LANGCHAIN_BASE_TYPES = {
|
129
|
+
"Chain": Chain,
|
130
|
+
"AgentExecutor": AgentExecutor,
|
131
|
+
"BaseTool": BaseTool,
|
132
|
+
"Tool": Tool,
|
133
|
+
"BaseLLM": BaseLLM,
|
134
|
+
"BaseLanguageModel": BaseLanguageModel,
|
135
|
+
"PromptTemplate": PromptTemplate,
|
136
|
+
"ChatPromptTemplate": ChatPromptTemplate,
|
137
|
+
"BasePromptTemplate": BasePromptTemplate,
|
138
|
+
"BaseLoader": BaseLoader,
|
139
|
+
"Document": Document,
|
140
|
+
"TextSplitter": TextSplitter,
|
141
|
+
"VectorStore": VectorStore,
|
142
|
+
"Embeddings": Embeddings,
|
143
|
+
"BaseRetriever": BaseRetriever,
|
144
|
+
"BaseOutputParser": BaseOutputParser,
|
145
|
+
"BaseMemory": BaseMemory,
|
146
|
+
"BaseChatMemory": BaseChatMemory,
|
147
|
+
"BaseChatModel": BaseChatModel,
|
148
|
+
"Memory": Memory,
|
149
|
+
"BaseDocumentCompressor": BaseDocumentCompressor,
|
150
|
+
}
|
151
|
+
|
152
|
+
# Langchain base types plus Python base types
|
153
|
+
CUSTOM_COMPONENT_SUPPORTED_TYPES = {
|
154
|
+
**LANGCHAIN_BASE_TYPES,
|
155
|
+
"NestedDict": NestedDict,
|
156
|
+
"Data": Data,
|
157
|
+
"Text": Text, # noqa: UP019
|
158
|
+
"Object": Object,
|
159
|
+
"Callable": Callable,
|
160
|
+
"LanguageModel": LanguageModel,
|
161
|
+
"Retriever": Retriever,
|
162
|
+
}
|
163
|
+
|
164
|
+
# Default import string for component code generation
|
165
|
+
LANGCHAIN_IMPORT_STRING = """from langchain.agents.agent import AgentExecutor
|
166
|
+
from langchain.chains.base import Chain
|
167
|
+
from langchain.memory.chat_memory import BaseChatMemory
|
168
|
+
from langchain_core.chat_history import BaseChatMessageHistory
|
169
|
+
from langchain_core.document_loaders import BaseLoader
|
170
|
+
from langchain_core.documents import Document
|
171
|
+
from langchain_core.embeddings import Embeddings
|
172
|
+
from langchain_core.language_models import BaseLanguageModel, BaseLLM
|
173
|
+
from langchain_core.language_models.chat_models import BaseChatModel
|
174
|
+
from langchain_core.memory import BaseMemory
|
175
|
+
from langchain_core.output_parsers import BaseLLMOutputParser, BaseOutputParser
|
176
|
+
from langchain_core.prompts import BasePromptTemplate, ChatPromptTemplate, PromptTemplate
|
177
|
+
from langchain_core.retrievers import BaseRetriever
|
178
|
+
from langchain_core.documents.compressor import BaseDocumentCompressor
|
179
|
+
from langchain_core.tools import BaseTool, Tool
|
180
|
+
from langchain_core.vectorstores import VectorStore, VectorStoreRetriever
|
181
|
+
from langchain_text_splitters import TextSplitter
|
182
|
+
"""
|
183
|
+
|
184
|
+
|
185
|
+
DEFAULT_IMPORT_STRING = """
|
186
|
+
|
187
|
+
from lfx.io import (
|
188
|
+
BoolInput,
|
189
|
+
CodeInput,
|
190
|
+
DataInput,
|
191
|
+
DictInput,
|
192
|
+
DropdownInput,
|
193
|
+
FileInput,
|
194
|
+
FloatInput,
|
195
|
+
HandleInput,
|
196
|
+
IntInput,
|
197
|
+
LinkInput,
|
198
|
+
MessageInput,
|
199
|
+
MessageTextInput,
|
200
|
+
MultilineInput,
|
201
|
+
MultilineSecretInput,
|
202
|
+
MultiselectInput,
|
203
|
+
NestedDictInput,
|
204
|
+
Output,
|
205
|
+
PromptInput,
|
206
|
+
SecretStrInput,
|
207
|
+
SliderInput,
|
208
|
+
StrInput,
|
209
|
+
TableInput,
|
210
|
+
)
|
211
|
+
from lfx.schema.data import Data
|
212
|
+
"""
|
213
|
+
|
214
|
+
if importlib.util.find_spec("langchain") is not None:
|
215
|
+
DEFAULT_IMPORT_STRING = LANGCHAIN_IMPORT_STRING + DEFAULT_IMPORT_STRING
|
@@ -0,0 +1,35 @@
|
|
1
|
+
"""Range specification for field types copied from langflow for lfx package."""
|
2
|
+
|
3
|
+
from typing import Literal
|
4
|
+
|
5
|
+
from pydantic import BaseModel, field_validator
|
6
|
+
|
7
|
+
|
8
|
+
class RangeSpec(BaseModel):
|
9
|
+
step_type: Literal["int", "float"] = "float"
|
10
|
+
min: float = -1.0
|
11
|
+
max: float = 1.0
|
12
|
+
step: float = 0.1
|
13
|
+
|
14
|
+
@field_validator("max")
|
15
|
+
@classmethod
|
16
|
+
def max_must_be_greater_than_min(cls, v, values):
|
17
|
+
if "min" in values.data and v <= values.data["min"]:
|
18
|
+
msg = "Max must be greater than min"
|
19
|
+
raise ValueError(msg)
|
20
|
+
return v
|
21
|
+
|
22
|
+
@field_validator("step")
|
23
|
+
@classmethod
|
24
|
+
def step_must_be_positive(cls, v, values):
|
25
|
+
if v <= 0:
|
26
|
+
msg = "Step must be positive"
|
27
|
+
raise ValueError(msg)
|
28
|
+
if values.data["step_type"] == "int" and isinstance(v, float) and not v.is_integer():
|
29
|
+
msg = "When step_type is int, step must be an integer"
|
30
|
+
raise ValueError(msg)
|
31
|
+
return v
|
32
|
+
|
33
|
+
@classmethod
|
34
|
+
def set_step_type(cls, step_type: Literal["int", "float"], range_spec: "RangeSpec") -> "RangeSpec":
|
35
|
+
return cls(min=range_spec.min, max=range_spec.max, step=range_spec.step, step_type=step_type)
|
lfx/graph/__init__.py
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
from lfx.graph.edge.base import Edge
|
2
|
+
from lfx.graph.graph.base import Graph
|
3
|
+
from lfx.graph.vertex.base import Vertex
|
4
|
+
from lfx.graph.vertex.vertex_types import CustomComponentVertex, InterfaceVertex, StateVertex
|
5
|
+
|
6
|
+
__all__ = ["CustomComponentVertex", "Edge", "Graph", "InterfaceVertex", "StateVertex", "Vertex"]
|
File without changes
|
lfx/graph/edge/base.py
ADDED
@@ -0,0 +1,277 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING, Any, cast
|
4
|
+
|
5
|
+
from lfx.graph.edge.schema import EdgeData, LoopTargetHandleDict, SourceHandle, TargetHandle, TargetHandleDict
|
6
|
+
from lfx.log.logger import logger
|
7
|
+
from lfx.schema.schema import INPUT_FIELD_NAME
|
8
|
+
|
9
|
+
if TYPE_CHECKING:
|
10
|
+
from lfx.graph.vertex.base import Vertex
|
11
|
+
|
12
|
+
|
13
|
+
class Edge:
|
14
|
+
def __init__(self, source: Vertex, target: Vertex, edge: EdgeData):
|
15
|
+
self.source_id: str = source.id if source else ""
|
16
|
+
self.target_id: str = target.id if target else ""
|
17
|
+
self.valid_handles: bool = False
|
18
|
+
self.target_param: str | None = None
|
19
|
+
self._target_handle: TargetHandleDict | str | None = None
|
20
|
+
self._data = edge.copy()
|
21
|
+
self.is_cycle = False
|
22
|
+
if data := edge.get("data", {}):
|
23
|
+
self._source_handle = data.get("sourceHandle", {})
|
24
|
+
self._target_handle = cast("TargetHandleDict", data.get("targetHandle", {}))
|
25
|
+
self.source_handle: SourceHandle = SourceHandle(**self._source_handle)
|
26
|
+
if isinstance(self._target_handle, dict):
|
27
|
+
try:
|
28
|
+
if "name" in self._target_handle:
|
29
|
+
self.target_handle: TargetHandle = TargetHandle.from_loop_target_handle(
|
30
|
+
cast("LoopTargetHandleDict", self._target_handle)
|
31
|
+
)
|
32
|
+
else:
|
33
|
+
self.target_handle = TargetHandle(**self._target_handle)
|
34
|
+
except Exception as e:
|
35
|
+
if "inputTypes" in self._target_handle and self._target_handle["inputTypes"] is None:
|
36
|
+
# Check if self._target_handle['fieldName']
|
37
|
+
if hasattr(target, "custom_component"):
|
38
|
+
display_name = getattr(target.custom_component, "display_name", "")
|
39
|
+
msg = (
|
40
|
+
f"Component {display_name} field '{self._target_handle['fieldName']}' "
|
41
|
+
"might not be a valid input."
|
42
|
+
)
|
43
|
+
raise ValueError(msg) from e
|
44
|
+
msg = (
|
45
|
+
f"Field '{self._target_handle['fieldName']}' on {target.display_name} "
|
46
|
+
"might not be a valid input."
|
47
|
+
)
|
48
|
+
raise ValueError(msg) from e
|
49
|
+
raise
|
50
|
+
|
51
|
+
else:
|
52
|
+
msg = "Target handle is not a dictionary"
|
53
|
+
raise ValueError(msg)
|
54
|
+
self.target_param = self.target_handle.field_name
|
55
|
+
# validate handles
|
56
|
+
self.validate_handles(source, target)
|
57
|
+
else:
|
58
|
+
# Logging here because this is a breaking change
|
59
|
+
logger.error("Edge data is empty")
|
60
|
+
self._source_handle = edge.get("sourceHandle", "") # type: ignore[assignment]
|
61
|
+
self._target_handle = edge.get("targetHandle", "") # type: ignore[assignment]
|
62
|
+
# 'BaseLoader;BaseOutputParser|documents|PromptTemplate-zmTlD'
|
63
|
+
# target_param is documents
|
64
|
+
if isinstance(self._target_handle, str):
|
65
|
+
self.target_param = self._target_handle.split("|")[1]
|
66
|
+
self.source_handle = None
|
67
|
+
self.target_handle = None
|
68
|
+
else:
|
69
|
+
msg = "Target handle is not a string"
|
70
|
+
raise ValueError(msg)
|
71
|
+
# Validate in __init__ to fail fast
|
72
|
+
self.validate_edge(source, target)
|
73
|
+
|
74
|
+
def to_data(self):
|
75
|
+
return self._data
|
76
|
+
|
77
|
+
def validate_handles(self, source, target) -> None:
|
78
|
+
if isinstance(self._source_handle, str) or self.source_handle.base_classes:
|
79
|
+
self._legacy_validate_handles(source, target)
|
80
|
+
else:
|
81
|
+
self._validate_handles(source, target)
|
82
|
+
|
83
|
+
def _validate_handles(self, source, target) -> None:
|
84
|
+
if self.target_handle.input_types is None:
|
85
|
+
self.valid_handles = self.target_handle.type in self.source_handle.output_types
|
86
|
+
elif self.target_handle.type is None:
|
87
|
+
# ! This is not a good solution
|
88
|
+
# This is a loop edge
|
89
|
+
# If the target_handle.type is None, it means it's a loop edge
|
90
|
+
# and we should check if the source_handle.output_types is not empty
|
91
|
+
# and if the target_handle.input_types is empty or if any of the source_handle.output_types
|
92
|
+
# is in the target_handle.input_types
|
93
|
+
self.valid_handles = bool(self.source_handle.output_types) and (
|
94
|
+
not self.target_handle.input_types
|
95
|
+
or any(output_type in self.target_handle.input_types for output_type in self.source_handle.output_types)
|
96
|
+
)
|
97
|
+
|
98
|
+
elif self.source_handle.output_types is not None:
|
99
|
+
self.valid_handles = (
|
100
|
+
any(output_type in self.target_handle.input_types for output_type in self.source_handle.output_types)
|
101
|
+
or self.target_handle.type in self.source_handle.output_types
|
102
|
+
)
|
103
|
+
|
104
|
+
if not self.valid_handles:
|
105
|
+
logger.debug(self.source_handle)
|
106
|
+
logger.debug(self.target_handle)
|
107
|
+
msg = f"Edge between {source.display_name} and {target.display_name} has invalid handles"
|
108
|
+
raise ValueError(msg)
|
109
|
+
|
110
|
+
def _legacy_validate_handles(self, source, target) -> None:
|
111
|
+
if self.target_handle.input_types is None:
|
112
|
+
self.valid_handles = self.target_handle.type in self.source_handle.base_classes
|
113
|
+
else:
|
114
|
+
self.valid_handles = (
|
115
|
+
any(baseClass in self.target_handle.input_types for baseClass in self.source_handle.base_classes)
|
116
|
+
or self.target_handle.type in self.source_handle.base_classes
|
117
|
+
)
|
118
|
+
if not self.valid_handles:
|
119
|
+
logger.debug(self.source_handle)
|
120
|
+
logger.debug(self.target_handle)
|
121
|
+
msg = f"Edge between {source.vertex_type} and {target.vertex_type} has invalid handles"
|
122
|
+
raise ValueError(msg)
|
123
|
+
|
124
|
+
def __setstate__(self, state):
|
125
|
+
self.source_id = state["source_id"]
|
126
|
+
self.target_id = state["target_id"]
|
127
|
+
self.target_param = state["target_param"]
|
128
|
+
self.source_handle = state.get("source_handle")
|
129
|
+
self.target_handle = state.get("target_handle")
|
130
|
+
self._source_handle = state.get("_source_handle")
|
131
|
+
self._target_handle = state.get("_target_handle")
|
132
|
+
self._data = state.get("_data")
|
133
|
+
self.valid_handles = state.get("valid_handles")
|
134
|
+
self.source_types = state.get("source_types")
|
135
|
+
self.target_reqs = state.get("target_reqs")
|
136
|
+
self.matched_type = state.get("matched_type")
|
137
|
+
|
138
|
+
def validate_edge(self, source, target) -> None:
|
139
|
+
# If the self.source_handle has base_classes, then we are using the legacy
|
140
|
+
# way of defining the source and target handles
|
141
|
+
if isinstance(self._source_handle, str) or self.source_handle.base_classes:
|
142
|
+
self._legacy_validate_edge(source, target)
|
143
|
+
else:
|
144
|
+
self._validate_edge(source, target)
|
145
|
+
|
146
|
+
def _validate_edge(self, source, target) -> None:
|
147
|
+
# Validate that the outputs of the source node are valid inputs
|
148
|
+
# for the target node
|
149
|
+
# .outputs is a list of Output objects as dictionaries
|
150
|
+
# meaning: check for "types" key in each dictionary
|
151
|
+
self.source_types = [output for output in source.outputs if output["name"] == self.source_handle.name]
|
152
|
+
self.target_reqs = target.required_inputs + target.optional_inputs
|
153
|
+
# Both lists contain strings and sometimes a string contains the value we are
|
154
|
+
# looking for e.g. comgin_out=["Chain"] and target_reqs=["LLMChain"]
|
155
|
+
# so we need to check if any of the strings in source_types is in target_reqs
|
156
|
+
self.valid = any(
|
157
|
+
any(output_type in target_req for output_type in output["types"])
|
158
|
+
for output in self.source_types
|
159
|
+
for target_req in self.target_reqs
|
160
|
+
)
|
161
|
+
# Get what type of input the target node is expecting
|
162
|
+
|
163
|
+
# Update the matched type to be the first found match
|
164
|
+
self.matched_type = next(
|
165
|
+
(
|
166
|
+
output_type
|
167
|
+
for output in self.source_types
|
168
|
+
for output_type in output["types"]
|
169
|
+
for target_req in self.target_reqs
|
170
|
+
if output_type in target_req
|
171
|
+
),
|
172
|
+
None,
|
173
|
+
)
|
174
|
+
no_matched_type = self.matched_type is None
|
175
|
+
if no_matched_type:
|
176
|
+
logger.debug(self.source_types)
|
177
|
+
logger.debug(self.target_reqs)
|
178
|
+
msg = f"Edge between {source.vertex_type} and {target.vertex_type} has no matched type."
|
179
|
+
raise ValueError(msg)
|
180
|
+
|
181
|
+
def _legacy_validate_edge(self, source, target) -> None:
|
182
|
+
# Validate that the outputs of the source node are valid inputs
|
183
|
+
# for the target node
|
184
|
+
self.source_types = source.output
|
185
|
+
self.target_reqs = target.required_inputs + target.optional_inputs
|
186
|
+
# Both lists contain strings and sometimes a string contains the value we are
|
187
|
+
# looking for e.g. comgin_out=["Chain"] and target_reqs=["LLMChain"]
|
188
|
+
# so we need to check if any of the strings in source_types is in target_reqs
|
189
|
+
self.valid = any(output in target_req for output in self.source_types for target_req in self.target_reqs)
|
190
|
+
# Get what type of input the target node is expecting
|
191
|
+
|
192
|
+
self.matched_type = next(
|
193
|
+
(output for output in self.source_types if output in self.target_reqs),
|
194
|
+
None,
|
195
|
+
)
|
196
|
+
no_matched_type = self.matched_type is None
|
197
|
+
if no_matched_type:
|
198
|
+
logger.debug(self.source_types)
|
199
|
+
logger.debug(self.target_reqs)
|
200
|
+
msg = f"Edge between {source.vertex_type} and {target.vertex_type} has no matched type"
|
201
|
+
raise ValueError(msg)
|
202
|
+
|
203
|
+
def __repr__(self) -> str:
|
204
|
+
if (hasattr(self, "source_handle") and self.source_handle) and (
|
205
|
+
hasattr(self, "target_handle") and self.target_handle
|
206
|
+
):
|
207
|
+
return f"{self.source_id} -[{self.source_handle.name}->{self.target_handle.field_name}]-> {self.target_id}"
|
208
|
+
return f"{self.source_id} -[{self.target_param}]-> {self.target_id}"
|
209
|
+
|
210
|
+
def __hash__(self) -> int:
|
211
|
+
return hash(self.__repr__())
|
212
|
+
|
213
|
+
def __eq__(self, /, other: object) -> bool:
|
214
|
+
if not isinstance(other, Edge):
|
215
|
+
return False
|
216
|
+
return (
|
217
|
+
self._source_handle == other._source_handle
|
218
|
+
and self._target_handle == other._target_handle
|
219
|
+
and self.target_param == other.target_param
|
220
|
+
)
|
221
|
+
|
222
|
+
def __str__(self) -> str:
|
223
|
+
return self.__repr__()
|
224
|
+
|
225
|
+
|
226
|
+
class CycleEdge(Edge):
|
227
|
+
def __init__(self, source: Vertex, target: Vertex, raw_edge: EdgeData):
|
228
|
+
super().__init__(source, target, raw_edge)
|
229
|
+
self.is_fulfilled = False # Whether the contract has been fulfilled.
|
230
|
+
self.result: Any = None
|
231
|
+
self.is_cycle = True
|
232
|
+
source.has_cycle_edges = True
|
233
|
+
target.has_cycle_edges = True
|
234
|
+
|
235
|
+
async def honor(self, source: Vertex, target: Vertex) -> None:
|
236
|
+
"""Fulfills the contract by setting the result of the source vertex to the target vertex's parameter.
|
237
|
+
|
238
|
+
If the edge is runnable, the source vertex is run with the message text and the target vertex's
|
239
|
+
root_field param is set to the
|
240
|
+
result. If the edge is not runnable, the target vertex's parameter is set to the result.
|
241
|
+
:param message: The message object to be processed if the edge is runnable.
|
242
|
+
"""
|
243
|
+
if self.is_fulfilled:
|
244
|
+
return
|
245
|
+
|
246
|
+
if not source.built:
|
247
|
+
# The system should be read-only, so we should not be building vertices
|
248
|
+
# that are not already built.
|
249
|
+
msg = f"Source vertex {source.id} is not built."
|
250
|
+
raise ValueError(msg)
|
251
|
+
|
252
|
+
if self.matched_type == "Text":
|
253
|
+
self.result = source.built_result
|
254
|
+
else:
|
255
|
+
self.result = source.built_object
|
256
|
+
|
257
|
+
target.params[self.target_param] = self.result
|
258
|
+
self.is_fulfilled = True
|
259
|
+
|
260
|
+
async def get_result_from_source(self, source: Vertex, target: Vertex):
|
261
|
+
# Fulfill the contract if it has not been fulfilled.
|
262
|
+
if not self.is_fulfilled:
|
263
|
+
await self.honor(source, target)
|
264
|
+
|
265
|
+
# If the target vertex is a power component we log messages
|
266
|
+
if (
|
267
|
+
target.vertex_type == "ChatOutput"
|
268
|
+
and isinstance(target.params.get(INPUT_FIELD_NAME), str | dict)
|
269
|
+
and target.params.get("message") == ""
|
270
|
+
):
|
271
|
+
return self.result
|
272
|
+
return self.result
|
273
|
+
|
274
|
+
def __repr__(self) -> str:
|
275
|
+
str_repr = super().__repr__()
|
276
|
+
# Add a symbol to show this is a cycle edge
|
277
|
+
return f"{str_repr} 🔄"
|
lfx/graph/edge/schema.py
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
from pydantic import ConfigDict, Field, field_validator
|
4
|
+
from typing_extensions import TypedDict
|
5
|
+
|
6
|
+
from lfx.helpers.base_model import BaseModel
|
7
|
+
|
8
|
+
|
9
|
+
class SourceHandleDict(TypedDict, total=False):
|
10
|
+
baseClasses: list[str]
|
11
|
+
dataType: str
|
12
|
+
id: str
|
13
|
+
name: str | None
|
14
|
+
output_types: list[str]
|
15
|
+
|
16
|
+
|
17
|
+
class TargetHandleDict(TypedDict):
|
18
|
+
fieldName: str
|
19
|
+
id: str
|
20
|
+
inputTypes: list[str] | None
|
21
|
+
type: str
|
22
|
+
|
23
|
+
|
24
|
+
class LoopTargetHandleDict(TypedDict):
|
25
|
+
dataType: str
|
26
|
+
id: str
|
27
|
+
name: str
|
28
|
+
output_types: list[str]
|
29
|
+
|
30
|
+
|
31
|
+
class EdgeDataDetails(TypedDict):
|
32
|
+
sourceHandle: SourceHandleDict
|
33
|
+
targetHandle: TargetHandleDict | LoopTargetHandleDict
|
34
|
+
|
35
|
+
|
36
|
+
class EdgeData(TypedDict, total=False):
|
37
|
+
source: str
|
38
|
+
target: str
|
39
|
+
data: EdgeDataDetails
|
40
|
+
|
41
|
+
|
42
|
+
class ResultPair(BaseModel):
|
43
|
+
result: Any
|
44
|
+
extra: Any
|
45
|
+
|
46
|
+
|
47
|
+
class Payload(BaseModel):
|
48
|
+
result_pairs: list[ResultPair] = []
|
49
|
+
|
50
|
+
def __iter__(self):
|
51
|
+
return iter(self.result_pairs)
|
52
|
+
|
53
|
+
def add_result_pair(self, result: Any, extra: Any | None = None) -> None:
|
54
|
+
self.result_pairs.append(ResultPair(result=result, extra=extra))
|
55
|
+
|
56
|
+
def get_last_result_pair(self) -> ResultPair:
|
57
|
+
return self.result_pairs[-1]
|
58
|
+
|
59
|
+
# format all but the last result pair
|
60
|
+
# into a string
|
61
|
+
def format(self, sep: str = "\n") -> str:
|
62
|
+
# Result: the result
|
63
|
+
# Extra: the extra if it exists don't show if it doesn't
|
64
|
+
return sep.join(
|
65
|
+
[
|
66
|
+
f"Result: {result_pair.result}\nExtra: {result_pair.extra}"
|
67
|
+
if result_pair.extra is not None
|
68
|
+
else f"Result: {result_pair.result}"
|
69
|
+
for result_pair in self.result_pairs[:-1]
|
70
|
+
]
|
71
|
+
)
|
72
|
+
|
73
|
+
|
74
|
+
class TargetHandle(BaseModel):
|
75
|
+
model_config = ConfigDict(populate_by_name=True)
|
76
|
+
field_name: str = Field(..., alias="fieldName", description="Field name for the target handle.")
|
77
|
+
id: str = Field(..., description="Unique identifier for the target handle.")
|
78
|
+
input_types: list[str] = Field(
|
79
|
+
default_factory=list, alias="inputTypes", description="List of input types for the target handle."
|
80
|
+
)
|
81
|
+
type: str = Field(None, description="Type of the target handle.")
|
82
|
+
|
83
|
+
@classmethod
|
84
|
+
def from_loop_target_handle(cls, target_handle: LoopTargetHandleDict) -> "TargetHandle":
|
85
|
+
# The target handle is a loop edge
|
86
|
+
# The target handle is a dict with the following keys:
|
87
|
+
# - name: str
|
88
|
+
# - id: str
|
89
|
+
# - inputTypes: list[str]
|
90
|
+
# - type: str
|
91
|
+
# It is built from an Output, which is why it has a different structure
|
92
|
+
return cls(
|
93
|
+
field_name=target_handle.get("name"),
|
94
|
+
id=target_handle.get("id"),
|
95
|
+
input_types=target_handle.get("output_types"),
|
96
|
+
)
|
97
|
+
|
98
|
+
|
99
|
+
class SourceHandle(BaseModel):
|
100
|
+
model_config = ConfigDict(populate_by_name=True)
|
101
|
+
base_classes: list[str] = Field(
|
102
|
+
default_factory=list, alias="baseClasses", description="List of base classes for the source handle."
|
103
|
+
)
|
104
|
+
data_type: str = Field(..., alias="dataType", description="Data type for the source handle.")
|
105
|
+
id: str = Field(..., description="Unique identifier for the source handle.")
|
106
|
+
name: str | None = Field(None, description="Name of the source handle.")
|
107
|
+
output_types: list[str] = Field(default_factory=list, description="List of output types for the source handle.")
|
108
|
+
|
109
|
+
@field_validator("name", mode="before")
|
110
|
+
@classmethod
|
111
|
+
def validate_name(cls, v, info):
|
112
|
+
if info.data["data_type"] == "GroupNode":
|
113
|
+
# 'OpenAIModel-u4iGV_text_output'
|
114
|
+
splits = v.split("_", 1)
|
115
|
+
if len(splits) != 2: # noqa: PLR2004
|
116
|
+
msg = f"Invalid source handle name {v}"
|
117
|
+
raise ValueError(msg)
|
118
|
+
v = splits[1]
|
119
|
+
return v
|
lfx/graph/edge/utils.py
ADDED
File without changes
|
File without changes
|