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/graph/schema.py
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
from enum import Enum
|
2
|
+
from typing import Any
|
3
|
+
|
4
|
+
from pydantic import BaseModel, Field, field_serializer, model_validator
|
5
|
+
|
6
|
+
from lfx.schema.schema import OutputValue, StreamURL
|
7
|
+
from lfx.serialization.serialization import serialize
|
8
|
+
from lfx.utils.schemas import ChatOutputResponse, ContainsEnumMeta
|
9
|
+
|
10
|
+
|
11
|
+
class ResultData(BaseModel):
|
12
|
+
results: Any | None = Field(default_factory=dict)
|
13
|
+
artifacts: Any | None = Field(default_factory=dict)
|
14
|
+
outputs: dict | None = Field(default_factory=dict)
|
15
|
+
logs: dict | None = Field(default_factory=dict)
|
16
|
+
messages: list[ChatOutputResponse] | None = Field(default_factory=list)
|
17
|
+
timedelta: float | None = None
|
18
|
+
duration: str | None = None
|
19
|
+
component_display_name: str | None = None
|
20
|
+
component_id: str | None = None
|
21
|
+
used_frozen_result: bool | None = False
|
22
|
+
|
23
|
+
@field_serializer("results")
|
24
|
+
def serialize_results(self, value):
|
25
|
+
if isinstance(value, dict):
|
26
|
+
return {key: serialize(val) for key, val in value.items()}
|
27
|
+
return serialize(value)
|
28
|
+
|
29
|
+
@model_validator(mode="before")
|
30
|
+
@classmethod
|
31
|
+
def validate_model(cls, values):
|
32
|
+
if not values.get("outputs") and values.get("artifacts"):
|
33
|
+
# Build the log from the artifacts
|
34
|
+
|
35
|
+
for key in values["artifacts"]:
|
36
|
+
message = values["artifacts"][key]
|
37
|
+
|
38
|
+
# ! Temporary fix
|
39
|
+
if message is None:
|
40
|
+
continue
|
41
|
+
|
42
|
+
if "stream_url" in message and "type" in message:
|
43
|
+
stream_url = StreamURL(location=message["stream_url"])
|
44
|
+
values["outputs"].update({key: OutputValue(message=stream_url, type=message["type"])})
|
45
|
+
elif "type" in message:
|
46
|
+
values["outputs"].update({key: OutputValue(message=message, type=message["type"])})
|
47
|
+
return values
|
48
|
+
|
49
|
+
|
50
|
+
class InterfaceComponentTypes(str, Enum, metaclass=ContainsEnumMeta):
|
51
|
+
ChatInput = "ChatInput"
|
52
|
+
ChatOutput = "ChatOutput"
|
53
|
+
TextInput = "TextInput"
|
54
|
+
TextOutput = "TextOutput"
|
55
|
+
DataOutput = "DataOutput"
|
56
|
+
WebhookInput = "Webhook"
|
57
|
+
|
58
|
+
|
59
|
+
CHAT_COMPONENTS = [InterfaceComponentTypes.ChatInput, InterfaceComponentTypes.ChatOutput]
|
60
|
+
RECORDS_COMPONENTS = [InterfaceComponentTypes.DataOutput]
|
61
|
+
INPUT_COMPONENTS = [
|
62
|
+
InterfaceComponentTypes.ChatInput,
|
63
|
+
InterfaceComponentTypes.WebhookInput,
|
64
|
+
InterfaceComponentTypes.TextInput,
|
65
|
+
]
|
66
|
+
OUTPUT_COMPONENTS = [
|
67
|
+
InterfaceComponentTypes.ChatOutput,
|
68
|
+
InterfaceComponentTypes.DataOutput,
|
69
|
+
InterfaceComponentTypes.TextOutput,
|
70
|
+
]
|
71
|
+
|
72
|
+
|
73
|
+
class RunOutputs(BaseModel):
|
74
|
+
inputs: dict = Field(default_factory=dict)
|
75
|
+
outputs: list[ResultData | None] = Field(default_factory=list)
|
File without changes
|
lfx/graph/state/model.py
ADDED
@@ -0,0 +1,237 @@
|
|
1
|
+
from collections.abc import Callable
|
2
|
+
from typing import Any, get_type_hints
|
3
|
+
|
4
|
+
from pydantic import ConfigDict, computed_field, create_model
|
5
|
+
from pydantic.fields import FieldInfo
|
6
|
+
|
7
|
+
|
8
|
+
def __validate_method(method: Callable) -> None:
|
9
|
+
"""Validates a method by checking if it has the required attributes.
|
10
|
+
|
11
|
+
This function ensures that the given method belongs to a class with the necessary
|
12
|
+
structure for output handling. It checks for the presence of a __self__ attribute
|
13
|
+
on the method and a get_output_by_method attribute on the method's class.
|
14
|
+
|
15
|
+
Args:
|
16
|
+
method (Callable): The method to be validated.
|
17
|
+
|
18
|
+
Raises:
|
19
|
+
ValueError: If the method does not have a __self__ attribute or if the method's
|
20
|
+
class does not have a get_output_by_method attribute.
|
21
|
+
|
22
|
+
Example:
|
23
|
+
>>> class ValidClass:
|
24
|
+
... def get_output_by_method(self):
|
25
|
+
... pass
|
26
|
+
... def valid_method(self):
|
27
|
+
... pass
|
28
|
+
>>> __validate_method(ValidClass().valid_method) # This will pass
|
29
|
+
>>> __validate_method(lambda x: x) # This will raise a ValueError
|
30
|
+
"""
|
31
|
+
if not hasattr(method, "__self__"):
|
32
|
+
msg = f"Method {method} does not have a __self__ attribute."
|
33
|
+
raise ValueError(msg)
|
34
|
+
if not hasattr(method.__self__, "get_output_by_method"):
|
35
|
+
msg = f"Method's class {method.__self__} must have a get_output_by_method attribute."
|
36
|
+
raise ValueError(msg)
|
37
|
+
|
38
|
+
|
39
|
+
def build_output_getter(method: Callable, *, validate: bool = True) -> Callable:
|
40
|
+
"""Builds an output getter function for a given method in a graph component.
|
41
|
+
|
42
|
+
This function creates a new callable that, when invoked, retrieves the output
|
43
|
+
of the specified method using the get_output_by_method of the method's class.
|
44
|
+
It's used in creating dynamic state models for graph components.
|
45
|
+
|
46
|
+
Args:
|
47
|
+
method (Callable): The method for which to build the output getter.
|
48
|
+
validate (bool, optional): Whether to validate the method before building
|
49
|
+
the getter. Defaults to True.
|
50
|
+
|
51
|
+
Returns:
|
52
|
+
Callable: The output getter function. When called, this function returns
|
53
|
+
the value of the output associated with the original method.
|
54
|
+
|
55
|
+
Raises:
|
56
|
+
ValueError: If the method has no return type annotation or if validation fails.
|
57
|
+
|
58
|
+
Notes:
|
59
|
+
- The getter function returns UNDEFINED if the output has not been set.
|
60
|
+
- When validate is True, the method must belong to a class with a
|
61
|
+
'get_output_by_method' attribute.
|
62
|
+
- This function is typically used internally by create_state_model.
|
63
|
+
|
64
|
+
Example:
|
65
|
+
>>> class ChatComponent:
|
66
|
+
... def get_output_by_method(self, method):
|
67
|
+
... return type('Output', (), {'value': "Hello, World!"})()
|
68
|
+
... def get_message(self) -> str:
|
69
|
+
... pass
|
70
|
+
>>> component = ChatComponent()
|
71
|
+
>>> getter = build_output_getter(component.get_message)
|
72
|
+
>>> print(getter(None)) # This will print "Hello, World!"
|
73
|
+
"""
|
74
|
+
|
75
|
+
def output_getter(_):
|
76
|
+
if validate:
|
77
|
+
__validate_method(method)
|
78
|
+
methods_class = method.__self__
|
79
|
+
output = methods_class.get_output_by_method(method)
|
80
|
+
return output.value
|
81
|
+
|
82
|
+
return_type = get_type_hints(method).get("return", None)
|
83
|
+
|
84
|
+
if return_type is None:
|
85
|
+
msg = f"Method {method.__name__} has no return type annotation."
|
86
|
+
raise ValueError(msg)
|
87
|
+
output_getter.__annotations__["return"] = return_type
|
88
|
+
return output_getter
|
89
|
+
|
90
|
+
|
91
|
+
def build_output_setter(method: Callable, *, validate: bool = True) -> Callable:
|
92
|
+
"""Build an output setter function for a given method in a graph component.
|
93
|
+
|
94
|
+
This function creates a new callable that, when invoked, sets the output
|
95
|
+
of the specified method using the get_output_by_method of the method's class.
|
96
|
+
It's used in creating dynamic state models for graph components, allowing
|
97
|
+
for the modification of component states.
|
98
|
+
|
99
|
+
Args:
|
100
|
+
method (Callable): The method for which the output setter is being built.
|
101
|
+
validate (bool, optional): Flag indicating whether to validate the method
|
102
|
+
before building the setter. Defaults to True.
|
103
|
+
|
104
|
+
Returns:
|
105
|
+
Callable: The output setter function. When called with a value, this function
|
106
|
+
sets the output associated with the original method to that value.
|
107
|
+
|
108
|
+
Raises:
|
109
|
+
ValueError: If validation fails when validate is True.
|
110
|
+
|
111
|
+
Notes:
|
112
|
+
- When validate is True, the method must belong to a class with a
|
113
|
+
'get_output_by_method' attribute.
|
114
|
+
- This function is typically used internally by create_state_model.
|
115
|
+
- The setter allows for dynamic updating of component states in a graph.
|
116
|
+
|
117
|
+
Example:
|
118
|
+
>>> class ChatComponent:
|
119
|
+
... def get_output_by_method(self, method):
|
120
|
+
... return type('Output', (), {'value': None})()
|
121
|
+
... def set_message(self):
|
122
|
+
... pass
|
123
|
+
>>> component = ChatComponent()
|
124
|
+
>>> setter = build_output_setter(component.set_message)
|
125
|
+
>>> setter(component, "New message")
|
126
|
+
>>> print(component.get_output_by_method(component.set_message).value) # Prints "New message"
|
127
|
+
"""
|
128
|
+
|
129
|
+
def output_setter(self, value) -> None: # noqa: ARG001
|
130
|
+
if validate:
|
131
|
+
__validate_method(method)
|
132
|
+
methods_class = method.__self__ # type: ignore[attr-defined]
|
133
|
+
output = methods_class.get_output_by_method(method)
|
134
|
+
output.value = value
|
135
|
+
|
136
|
+
return output_setter
|
137
|
+
|
138
|
+
|
139
|
+
def create_state_model(model_name: str = "State", *, validate: bool = True, **kwargs) -> type:
|
140
|
+
"""Create a dynamic Pydantic state model based on the provided keyword arguments.
|
141
|
+
|
142
|
+
This function generates a Pydantic model class with fields corresponding to the
|
143
|
+
provided keyword arguments. It can handle various types of field definitions,
|
144
|
+
including callable methods (which are converted to properties), FieldInfo objects,
|
145
|
+
and type-default value tuples.
|
146
|
+
|
147
|
+
Args:
|
148
|
+
model_name (str, optional): The name of the model. Defaults to "State".
|
149
|
+
validate (bool, optional): Whether to validate the methods when converting
|
150
|
+
them to properties. Defaults to True.
|
151
|
+
**kwargs: Keyword arguments representing the fields of the model. Each argument
|
152
|
+
can be a callable method, a FieldInfo object, or a tuple of (type, default).
|
153
|
+
|
154
|
+
Returns:
|
155
|
+
type: The dynamically created Pydantic state model class.
|
156
|
+
|
157
|
+
Raises:
|
158
|
+
ValueError: If the provided field value is invalid or cannot be processed.
|
159
|
+
|
160
|
+
Examples:
|
161
|
+
>>> from lfx.components.io import ChatInput
|
162
|
+
>>> from lfx.components.io.ChatOutput import ChatOutput
|
163
|
+
>>> from pydantic import Field
|
164
|
+
>>>
|
165
|
+
>>> chat_input = ChatInput()
|
166
|
+
>>> chat_output = ChatOutput()
|
167
|
+
>>>
|
168
|
+
>>> # Create a model with a method from a component
|
169
|
+
>>> StateModel = create_state_model(method_one=chat_input.message_response)
|
170
|
+
>>> state = StateModel()
|
171
|
+
>>> assert state.method_one is UNDEFINED
|
172
|
+
>>> chat_input.set_output_value("message", "test")
|
173
|
+
>>> assert state.method_one == "test"
|
174
|
+
>>>
|
175
|
+
>>> # Create a model with multiple components and a Pydantic Field
|
176
|
+
>>> NewStateModel = create_state_model(
|
177
|
+
... model_name="NewStateModel",
|
178
|
+
... first_method=chat_input.message_response,
|
179
|
+
... second_method=chat_output.message_response,
|
180
|
+
... my_attribute=Field(None)
|
181
|
+
... )
|
182
|
+
>>> new_state = NewStateModel()
|
183
|
+
>>> new_state.first_method = "test"
|
184
|
+
>>> new_state.my_attribute = 123
|
185
|
+
>>> assert new_state.first_method == "test"
|
186
|
+
>>> assert new_state.my_attribute == 123
|
187
|
+
>>>
|
188
|
+
>>> # Create a model with tuple-based field definitions
|
189
|
+
>>> TupleStateModel = create_state_model(field_one=(str, "default"), field_two=(int, 123))
|
190
|
+
>>> tuple_state = TupleStateModel()
|
191
|
+
>>> assert tuple_state.field_one == "default"
|
192
|
+
>>> assert tuple_state.field_two == 123
|
193
|
+
|
194
|
+
Notes:
|
195
|
+
- The function handles empty keyword arguments gracefully.
|
196
|
+
- For tuple-based field definitions, the first element must be a valid Python type.
|
197
|
+
- Unsupported value types in keyword arguments will raise a ValueError.
|
198
|
+
- Callable methods must have proper return type annotations and belong to a class
|
199
|
+
with a 'get_output_by_method' attribute when validate is True.
|
200
|
+
"""
|
201
|
+
fields = {}
|
202
|
+
|
203
|
+
for name, value in kwargs.items():
|
204
|
+
# Extract the return type from the method's type annotations
|
205
|
+
if callable(value):
|
206
|
+
# Define the field with the return type
|
207
|
+
try:
|
208
|
+
__validate_method(value)
|
209
|
+
getter = build_output_getter(value, validate=validate)
|
210
|
+
setter = build_output_setter(value, validate=validate)
|
211
|
+
property_method = property(getter, setter)
|
212
|
+
except ValueError as e:
|
213
|
+
# If the method is not valid,assume it is already a getter
|
214
|
+
if ("get_output_by_method" not in str(e) and "__self__" not in str(e)) or validate:
|
215
|
+
raise
|
216
|
+
property_method = value
|
217
|
+
fields[name] = computed_field(property_method)
|
218
|
+
elif isinstance(value, FieldInfo):
|
219
|
+
field_tuple = (value.annotation or Any, value)
|
220
|
+
fields[name] = field_tuple
|
221
|
+
elif isinstance(value, tuple) and len(value) == 2: # noqa: PLR2004
|
222
|
+
# Fields are defined by one of the following tuple forms:
|
223
|
+
|
224
|
+
# (<type>, <default value>)
|
225
|
+
# (<type>, Field(...))
|
226
|
+
# typing.Annotated[<type>, Field(...)]
|
227
|
+
if not isinstance(value[0], type):
|
228
|
+
msg = f"Invalid type for field {name}: {type(value[0])}"
|
229
|
+
raise TypeError(msg)
|
230
|
+
fields[name] = (value[0], value[1])
|
231
|
+
else:
|
232
|
+
msg = f"Invalid value type {type(value)} for field {name}"
|
233
|
+
raise ValueError(msg)
|
234
|
+
|
235
|
+
# Create the model dynamically
|
236
|
+
config_dict = ConfigDict(arbitrary_types_allowed=True, validate_assignment=True)
|
237
|
+
return create_model(model_name, __config__=config_dict, **fields)
|
lfx/graph/utils.py
ADDED
@@ -0,0 +1,200 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
from collections.abc import Generator
|
4
|
+
from enum import Enum
|
5
|
+
from typing import TYPE_CHECKING, Any
|
6
|
+
from uuid import UUID
|
7
|
+
|
8
|
+
from lfx.interface.utils import extract_input_variables_from_prompt
|
9
|
+
from lfx.log.logger import logger
|
10
|
+
from lfx.schema.data import Data
|
11
|
+
from lfx.schema.message import Message
|
12
|
+
|
13
|
+
# Database imports removed - lfx should be lightweight
|
14
|
+
from lfx.services.deps import get_db_service, get_settings_service
|
15
|
+
|
16
|
+
if TYPE_CHECKING:
|
17
|
+
from lfx.graph.vertex.base import Vertex
|
18
|
+
|
19
|
+
|
20
|
+
class UnbuiltObject:
|
21
|
+
pass
|
22
|
+
|
23
|
+
|
24
|
+
class UnbuiltResult:
|
25
|
+
pass
|
26
|
+
|
27
|
+
|
28
|
+
class ArtifactType(str, Enum):
|
29
|
+
TEXT = "text"
|
30
|
+
RECORD = "record"
|
31
|
+
OBJECT = "object"
|
32
|
+
ARRAY = "array"
|
33
|
+
STREAM = "stream"
|
34
|
+
UNKNOWN = "unknown"
|
35
|
+
MESSAGE = "message"
|
36
|
+
|
37
|
+
|
38
|
+
def validate_prompt(prompt: str):
|
39
|
+
"""Validate prompt."""
|
40
|
+
if extract_input_variables_from_prompt(prompt):
|
41
|
+
return prompt
|
42
|
+
|
43
|
+
return fix_prompt(prompt)
|
44
|
+
|
45
|
+
|
46
|
+
def fix_prompt(prompt: str):
|
47
|
+
"""Fix prompt."""
|
48
|
+
return prompt + " {input}"
|
49
|
+
|
50
|
+
|
51
|
+
def flatten_list(list_of_lists: list[list | Any]) -> list:
|
52
|
+
"""Flatten list of lists."""
|
53
|
+
new_list = []
|
54
|
+
for item in list_of_lists:
|
55
|
+
if isinstance(item, list):
|
56
|
+
new_list.extend(item)
|
57
|
+
else:
|
58
|
+
new_list.append(item)
|
59
|
+
return new_list
|
60
|
+
|
61
|
+
|
62
|
+
def get_artifact_type(value, build_result) -> str:
|
63
|
+
result = ArtifactType.UNKNOWN
|
64
|
+
match value:
|
65
|
+
case Data():
|
66
|
+
result = ArtifactType.RECORD
|
67
|
+
|
68
|
+
case str():
|
69
|
+
result = ArtifactType.TEXT
|
70
|
+
|
71
|
+
case dict():
|
72
|
+
result = ArtifactType.OBJECT
|
73
|
+
|
74
|
+
case list():
|
75
|
+
result = ArtifactType.ARRAY
|
76
|
+
|
77
|
+
case Message():
|
78
|
+
result = ArtifactType.MESSAGE
|
79
|
+
|
80
|
+
if result == ArtifactType.UNKNOWN and (
|
81
|
+
isinstance(build_result, Generator) or (isinstance(value, Message) and isinstance(value.text, Generator))
|
82
|
+
):
|
83
|
+
result = ArtifactType.STREAM
|
84
|
+
|
85
|
+
return result.value
|
86
|
+
|
87
|
+
|
88
|
+
def post_process_raw(raw, artifact_type: str):
|
89
|
+
if artifact_type == ArtifactType.STREAM.value:
|
90
|
+
raw = ""
|
91
|
+
|
92
|
+
return raw
|
93
|
+
|
94
|
+
|
95
|
+
def _vertex_to_primitive_dict(target: Vertex) -> dict:
|
96
|
+
"""Cleans the parameters of the target vertex."""
|
97
|
+
# Removes all keys that the values aren't python types like str, int, bool, etc.
|
98
|
+
params = {
|
99
|
+
key: value for key, value in target.params.items() if isinstance(value, str | int | bool | float | list | dict)
|
100
|
+
}
|
101
|
+
# if it is a list we need to check if the contents are python types
|
102
|
+
for key, value in params.items():
|
103
|
+
if isinstance(value, list):
|
104
|
+
params[key] = [item for item in value if isinstance(item, str | int | bool | float | list | dict)]
|
105
|
+
return params
|
106
|
+
|
107
|
+
|
108
|
+
async def log_transaction(
|
109
|
+
flow_id: str | UUID,
|
110
|
+
source: Vertex,
|
111
|
+
status,
|
112
|
+
target: Vertex | None = None, # noqa: ARG001
|
113
|
+
error=None, # noqa: ARG001
|
114
|
+
) -> None:
|
115
|
+
"""Asynchronously logs a transaction record for a vertex in a flow if transaction storage is enabled.
|
116
|
+
|
117
|
+
This is a lightweight implementation that only logs if database service is available.
|
118
|
+
"""
|
119
|
+
try:
|
120
|
+
settings_service = get_settings_service()
|
121
|
+
if not settings_service or not getattr(settings_service.settings, "transactions_storage_enabled", False):
|
122
|
+
return
|
123
|
+
|
124
|
+
db_service = get_db_service()
|
125
|
+
if db_service is None:
|
126
|
+
logger.debug("Database service not available, skipping transaction logging")
|
127
|
+
return
|
128
|
+
|
129
|
+
if not flow_id:
|
130
|
+
if source.graph.flow_id:
|
131
|
+
flow_id = source.graph.flow_id
|
132
|
+
else:
|
133
|
+
return
|
134
|
+
|
135
|
+
# Log basic transaction info - concrete implementation should be in langflow
|
136
|
+
logger.debug(f"Transaction logged: vertex={source.id}, flow={flow_id}, status={status}")
|
137
|
+
except Exception as exc: # noqa: BLE001
|
138
|
+
logger.debug(f"Error logging transaction: {exc!s}")
|
139
|
+
|
140
|
+
|
141
|
+
async def log_vertex_build(
|
142
|
+
*,
|
143
|
+
flow_id: str | UUID,
|
144
|
+
vertex_id: str,
|
145
|
+
valid: bool,
|
146
|
+
params: Any, # noqa: ARG001
|
147
|
+
data: dict | Any, # noqa: ARG001
|
148
|
+
artifacts: dict | None = None, # noqa: ARG001
|
149
|
+
) -> None:
|
150
|
+
"""Asynchronously logs a vertex build record if vertex build storage is enabled.
|
151
|
+
|
152
|
+
This is a lightweight implementation that only logs if database service is available.
|
153
|
+
"""
|
154
|
+
try:
|
155
|
+
settings_service = get_settings_service()
|
156
|
+
if not settings_service or not getattr(settings_service.settings, "vertex_builds_storage_enabled", False):
|
157
|
+
return
|
158
|
+
|
159
|
+
db_service = get_db_service()
|
160
|
+
if db_service is None:
|
161
|
+
logger.debug("Database service not available, skipping vertex build logging")
|
162
|
+
return
|
163
|
+
|
164
|
+
try:
|
165
|
+
if isinstance(flow_id, str):
|
166
|
+
flow_id = UUID(flow_id)
|
167
|
+
except ValueError:
|
168
|
+
logger.debug(f"Invalid flow_id passed to log_vertex_build: {flow_id!r}")
|
169
|
+
return
|
170
|
+
|
171
|
+
# Log basic vertex build info - concrete implementation should be in langflow
|
172
|
+
logger.debug(f"Vertex build logged: vertex={vertex_id}, flow={flow_id}, valid={valid}")
|
173
|
+
except Exception: # noqa: BLE001
|
174
|
+
logger.debug("Error logging vertex build")
|
175
|
+
|
176
|
+
|
177
|
+
def rewrite_file_path(file_path: str):
|
178
|
+
file_path = file_path.replace("\\", "/")
|
179
|
+
|
180
|
+
if ":" in file_path:
|
181
|
+
file_path = file_path.split(":", 1)[-1]
|
182
|
+
|
183
|
+
file_path_split = [part for part in file_path.split("/") if part]
|
184
|
+
|
185
|
+
if len(file_path_split) > 1:
|
186
|
+
consistent_file_path = f"{file_path_split[-2]}/{file_path_split[-1]}"
|
187
|
+
else:
|
188
|
+
consistent_file_path = "/".join(file_path_split)
|
189
|
+
|
190
|
+
return [consistent_file_path]
|
191
|
+
|
192
|
+
|
193
|
+
def has_output_vertex(vertices: dict[Vertex, int]):
|
194
|
+
return any(vertex.is_output for vertex in vertices)
|
195
|
+
|
196
|
+
|
197
|
+
def has_chat_output(vertices: dict[Vertex, int]):
|
198
|
+
from lfx.graph.schema import InterfaceComponentTypes
|
199
|
+
|
200
|
+
return any(InterfaceComponentTypes.ChatOutput in vertex.id for vertex in vertices)
|
File without changes
|