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 @@
|
|
1
|
+
"""Shared component cache service module."""
|
@@ -0,0 +1,30 @@
|
|
1
|
+
"""Factory for creating shared component cache service."""
|
2
|
+
|
3
|
+
from typing import TYPE_CHECKING
|
4
|
+
|
5
|
+
from lfx.services.factory import ServiceFactory
|
6
|
+
from lfx.services.shared_component_cache.service import SharedComponentCacheService
|
7
|
+
|
8
|
+
if TYPE_CHECKING:
|
9
|
+
from lfx.services.base import Service
|
10
|
+
|
11
|
+
|
12
|
+
class SharedComponentCacheServiceFactory(ServiceFactory):
|
13
|
+
"""Factory for creating SharedComponentCacheService instances."""
|
14
|
+
|
15
|
+
def __init__(self) -> None:
|
16
|
+
"""Initialize the factory."""
|
17
|
+
super().__init__()
|
18
|
+
self.service_class = SharedComponentCacheService
|
19
|
+
|
20
|
+
def create(self, **kwargs) -> "Service":
|
21
|
+
"""Create a SharedComponentCacheService instance.
|
22
|
+
|
23
|
+
Args:
|
24
|
+
**kwargs: Keyword arguments including expiration_time
|
25
|
+
|
26
|
+
Returns:
|
27
|
+
SharedComponentCacheService instance
|
28
|
+
"""
|
29
|
+
expiration_time = kwargs.get("expiration_time", 60 * 60) # Default 1 hour
|
30
|
+
return SharedComponentCacheService(expiration_time=expiration_time)
|
@@ -0,0 +1,9 @@
|
|
1
|
+
"""Shared component cache service implementation."""
|
2
|
+
|
3
|
+
from lfx.services.cache.service import ThreadingInMemoryCache
|
4
|
+
|
5
|
+
|
6
|
+
class SharedComponentCacheService(ThreadingInMemoryCache):
|
7
|
+
"""A caching service shared across components."""
|
8
|
+
|
9
|
+
name = "shared_component_cache_service"
|
@@ -0,0 +1,155 @@
|
|
1
|
+
"""Local file-based storage service for lfx package."""
|
2
|
+
|
3
|
+
from pathlib import Path
|
4
|
+
|
5
|
+
from lfx.log.logger import logger
|
6
|
+
from lfx.services.storage.service import StorageService
|
7
|
+
|
8
|
+
|
9
|
+
class LocalStorageService(StorageService):
|
10
|
+
"""A service class for handling local file storage operations."""
|
11
|
+
|
12
|
+
def __init__(self, data_dir: str | Path | None = None) -> None:
|
13
|
+
"""Initialize the local storage service."""
|
14
|
+
super().__init__(data_dir)
|
15
|
+
self.set_ready()
|
16
|
+
|
17
|
+
def build_full_path(self, flow_id: str, file_name: str) -> str:
|
18
|
+
"""Build the full path of a file in the local storage."""
|
19
|
+
return str(self.data_dir / flow_id / file_name)
|
20
|
+
|
21
|
+
async def save_file(self, flow_id: str, file_name: str, data: bytes) -> None:
|
22
|
+
"""Save a file in the local storage.
|
23
|
+
|
24
|
+
Args:
|
25
|
+
flow_id: The identifier for the flow.
|
26
|
+
file_name: The name of the file to be saved.
|
27
|
+
data: The byte content of the file.
|
28
|
+
|
29
|
+
Raises:
|
30
|
+
FileNotFoundError: If the specified flow does not exist.
|
31
|
+
IsADirectoryError: If the file name is a directory.
|
32
|
+
PermissionError: If there is no permission to write the file.
|
33
|
+
"""
|
34
|
+
folder_path = self.data_dir / flow_id
|
35
|
+
folder_path.mkdir(parents=True, exist_ok=True)
|
36
|
+
file_path = folder_path / file_name
|
37
|
+
|
38
|
+
try:
|
39
|
+
with file_path.open("wb") as f:
|
40
|
+
f.write(data)
|
41
|
+
except Exception:
|
42
|
+
logger.exception(f"Error saving file {file_name} in flow {flow_id}")
|
43
|
+
raise
|
44
|
+
else:
|
45
|
+
logger.info(f"File {file_name} saved successfully in flow {flow_id}.")
|
46
|
+
|
47
|
+
async def get_file(self, flow_id: str, file_name: str) -> bytes:
|
48
|
+
"""Retrieve a file from the local storage.
|
49
|
+
|
50
|
+
Args:
|
51
|
+
flow_id: The identifier for the flow.
|
52
|
+
file_name: The name of the file to be retrieved.
|
53
|
+
|
54
|
+
Returns:
|
55
|
+
The byte content of the file.
|
56
|
+
|
57
|
+
Raises:
|
58
|
+
FileNotFoundError: If the file does not exist.
|
59
|
+
"""
|
60
|
+
file_path = self.data_dir / flow_id / file_name
|
61
|
+
if not file_path.exists():
|
62
|
+
logger.warning(f"File {file_name} not found in flow {flow_id}.")
|
63
|
+
msg = f"File {file_name} not found in flow {flow_id}"
|
64
|
+
raise FileNotFoundError(msg)
|
65
|
+
|
66
|
+
try:
|
67
|
+
with file_path.open("rb") as f:
|
68
|
+
content = f.read()
|
69
|
+
except Exception:
|
70
|
+
logger.exception(f"Error reading file {file_name} in flow {flow_id}")
|
71
|
+
raise
|
72
|
+
else:
|
73
|
+
logger.debug(f"File {file_name} retrieved successfully from flow {flow_id}.")
|
74
|
+
return content
|
75
|
+
|
76
|
+
async def list_files(self, flow_id: str) -> list[str]:
|
77
|
+
"""List all files in a specific flow directory.
|
78
|
+
|
79
|
+
Args:
|
80
|
+
flow_id: The identifier for the flow.
|
81
|
+
|
82
|
+
Returns:
|
83
|
+
List of file names in the flow directory.
|
84
|
+
"""
|
85
|
+
if not isinstance(flow_id, str):
|
86
|
+
flow_id = str(flow_id)
|
87
|
+
|
88
|
+
folder_path = self.data_dir / flow_id
|
89
|
+
if not folder_path.exists():
|
90
|
+
logger.debug(f"Flow folder {flow_id} does not exist.")
|
91
|
+
return []
|
92
|
+
|
93
|
+
if not folder_path.is_dir():
|
94
|
+
logger.warning(f"Flow path {flow_id} is not a directory.")
|
95
|
+
return []
|
96
|
+
|
97
|
+
try:
|
98
|
+
files = [item.name for item in folder_path.iterdir() if item.is_file()]
|
99
|
+
except Exception: # noqa: BLE001
|
100
|
+
logger.exception(f"Error listing files in flow {flow_id}")
|
101
|
+
return []
|
102
|
+
else:
|
103
|
+
logger.debug(f"Listed {len(files)} files in flow {flow_id}.")
|
104
|
+
return files
|
105
|
+
|
106
|
+
async def delete_file(self, flow_id: str, file_name: str) -> None:
|
107
|
+
"""Delete a file from the local storage.
|
108
|
+
|
109
|
+
Args:
|
110
|
+
flow_id: The identifier for the flow.
|
111
|
+
file_name: The name of the file to be deleted.
|
112
|
+
|
113
|
+
Raises:
|
114
|
+
FileNotFoundError: If the file does not exist.
|
115
|
+
"""
|
116
|
+
file_path = self.data_dir / flow_id / file_name
|
117
|
+
if not file_path.exists():
|
118
|
+
logger.warning(f"File {file_name} not found in flow {flow_id}.")
|
119
|
+
msg = f"File {file_name} not found in flow {flow_id}"
|
120
|
+
raise FileNotFoundError(msg)
|
121
|
+
|
122
|
+
try:
|
123
|
+
file_path.unlink()
|
124
|
+
logger.info(f"File {file_name} deleted successfully from flow {flow_id}.")
|
125
|
+
except Exception:
|
126
|
+
logger.exception(f"Error deleting file {file_name} in flow {flow_id}")
|
127
|
+
raise
|
128
|
+
|
129
|
+
async def get_file_size(self, flow_id: str, file_name: str) -> int:
|
130
|
+
"""Get the size of a file in bytes.
|
131
|
+
|
132
|
+
Args:
|
133
|
+
flow_id: The identifier for the flow.
|
134
|
+
file_name: The name of the file.
|
135
|
+
|
136
|
+
Returns:
|
137
|
+
The size of the file in bytes.
|
138
|
+
|
139
|
+
Raises:
|
140
|
+
FileNotFoundError: If the file does not exist.
|
141
|
+
"""
|
142
|
+
file_path = self.data_dir / flow_id / file_name
|
143
|
+
if not file_path.exists():
|
144
|
+
logger.warning(f"File {file_name} not found in flow {flow_id}.")
|
145
|
+
msg = f"File {file_name} not found in flow {flow_id}"
|
146
|
+
raise FileNotFoundError(msg)
|
147
|
+
|
148
|
+
try:
|
149
|
+
size = file_path.stat().st_size
|
150
|
+
except Exception:
|
151
|
+
logger.exception(f"Error getting size of file {file_name} in flow {flow_id}")
|
152
|
+
raise
|
153
|
+
else:
|
154
|
+
logger.debug(f"File {file_name} size: {size} bytes in flow {flow_id}.")
|
155
|
+
return size
|
@@ -0,0 +1,54 @@
|
|
1
|
+
"""Base storage service for lfx package."""
|
2
|
+
|
3
|
+
from abc import ABC, abstractmethod
|
4
|
+
from pathlib import Path
|
5
|
+
|
6
|
+
|
7
|
+
class StorageService(ABC):
|
8
|
+
"""Abstract base class for storage services."""
|
9
|
+
|
10
|
+
def __init__(self, data_dir: str | Path | None = None) -> None:
|
11
|
+
"""Initialize the storage service.
|
12
|
+
|
13
|
+
Args:
|
14
|
+
data_dir: Directory path for storing data. Defaults to ~/.lfx/data
|
15
|
+
"""
|
16
|
+
if data_dir is None:
|
17
|
+
data_dir = Path.home() / ".lfx" / "data"
|
18
|
+
self.data_dir = Path(data_dir)
|
19
|
+
self._ready = False
|
20
|
+
|
21
|
+
def set_ready(self) -> None:
|
22
|
+
"""Mark the service as ready."""
|
23
|
+
self._ready = True
|
24
|
+
# Ensure the data directory exists
|
25
|
+
self.data_dir.mkdir(parents=True, exist_ok=True)
|
26
|
+
|
27
|
+
@property
|
28
|
+
def ready(self) -> bool:
|
29
|
+
"""Check if the service is ready."""
|
30
|
+
return self._ready
|
31
|
+
|
32
|
+
@abstractmethod
|
33
|
+
def build_full_path(self, flow_id: str, file_name: str) -> str:
|
34
|
+
"""Build the full path for a file."""
|
35
|
+
|
36
|
+
@abstractmethod
|
37
|
+
async def save_file(self, flow_id: str, file_name: str, data: bytes) -> None:
|
38
|
+
"""Save a file."""
|
39
|
+
|
40
|
+
@abstractmethod
|
41
|
+
async def get_file(self, flow_id: str, file_name: str) -> bytes:
|
42
|
+
"""Retrieve a file."""
|
43
|
+
|
44
|
+
@abstractmethod
|
45
|
+
async def list_files(self, flow_id: str) -> list[str]:
|
46
|
+
"""List files in a flow."""
|
47
|
+
|
48
|
+
@abstractmethod
|
49
|
+
async def delete_file(self, flow_id: str, file_name: str) -> None:
|
50
|
+
"""Delete a file."""
|
51
|
+
|
52
|
+
@abstractmethod
|
53
|
+
async def get_file_size(self, flow_id: str, file_name: str) -> int:
|
54
|
+
"""Get the size of a file."""
|
@@ -0,0 +1 @@
|
|
1
|
+
# Tracing service for lfx package
|
@@ -0,0 +1,21 @@
|
|
1
|
+
"""Lightweight tracing service for lfx package."""
|
2
|
+
|
3
|
+
from lfx.services.base import Service
|
4
|
+
|
5
|
+
|
6
|
+
class TracingService(Service):
|
7
|
+
"""Lightweight tracing service."""
|
8
|
+
|
9
|
+
@property
|
10
|
+
def name(self) -> str:
|
11
|
+
return "tracing_service"
|
12
|
+
|
13
|
+
def log(self, message: str, **kwargs) -> None: # noqa: ARG002
|
14
|
+
"""Log a message with optional metadata."""
|
15
|
+
# Lightweight implementation - just log basic info
|
16
|
+
from lfx.log.logger import logger
|
17
|
+
|
18
|
+
logger.debug(f"Trace: {message}")
|
19
|
+
|
20
|
+
async def teardown(self) -> None:
|
21
|
+
"""Teardown the tracing service."""
|
lfx/settings.py
ADDED
lfx/template/__init__.py
ADDED
File without changes
|
@@ -0,0 +1,257 @@
|
|
1
|
+
from collections.abc import Callable
|
2
|
+
from enum import Enum
|
3
|
+
from typing import ( # type: ignore[attr-defined]
|
4
|
+
Any,
|
5
|
+
GenericAlias, # type: ignore[attr-defined]
|
6
|
+
_GenericAlias, # type: ignore[attr-defined]
|
7
|
+
_UnionGenericAlias, # type: ignore[attr-defined]
|
8
|
+
)
|
9
|
+
|
10
|
+
from pydantic import (
|
11
|
+
BaseModel,
|
12
|
+
ConfigDict,
|
13
|
+
Field,
|
14
|
+
field_serializer,
|
15
|
+
field_validator,
|
16
|
+
model_serializer,
|
17
|
+
model_validator,
|
18
|
+
)
|
19
|
+
|
20
|
+
from lfx.field_typing import Text
|
21
|
+
from lfx.field_typing.range_spec import RangeSpec
|
22
|
+
from lfx.helpers.custom import format_type
|
23
|
+
from lfx.schema.data import Data
|
24
|
+
from lfx.type_extraction import post_process_type
|
25
|
+
|
26
|
+
|
27
|
+
class UndefinedType(Enum):
|
28
|
+
undefined = "__UNDEFINED__"
|
29
|
+
|
30
|
+
|
31
|
+
UNDEFINED = UndefinedType.undefined
|
32
|
+
|
33
|
+
|
34
|
+
class Input(BaseModel):
|
35
|
+
model_config = ConfigDict(arbitrary_types_allowed=True)
|
36
|
+
|
37
|
+
field_type: str | type | None = Field(default=str, serialization_alias="type")
|
38
|
+
"""The type of field this is. Default is a string."""
|
39
|
+
|
40
|
+
required: bool = False
|
41
|
+
"""Specifies if the field is required. Defaults to False."""
|
42
|
+
|
43
|
+
placeholder: str = ""
|
44
|
+
"""A placeholder string for the field. Default is an empty string."""
|
45
|
+
|
46
|
+
is_list: bool = Field(default=False, serialization_alias="list")
|
47
|
+
"""Defines if the field is a list. Default is False."""
|
48
|
+
|
49
|
+
show: bool = True
|
50
|
+
"""Should the field be shown. Defaults to True."""
|
51
|
+
|
52
|
+
multiline: bool = False
|
53
|
+
"""Defines if the field will allow the user to open a text editor. Default is False."""
|
54
|
+
|
55
|
+
value: Any = None
|
56
|
+
"""The value of the field. Default is None."""
|
57
|
+
|
58
|
+
file_types: list[str] = Field(default=[], serialization_alias="fileTypes")
|
59
|
+
"""List of file types associated with the field . Default is an empty list."""
|
60
|
+
|
61
|
+
file_path: str | None = ""
|
62
|
+
"""The file path of the field if it is a file. Defaults to None."""
|
63
|
+
|
64
|
+
password: bool | None = None
|
65
|
+
"""Specifies if the field is a password. Defaults to None."""
|
66
|
+
|
67
|
+
options: list[str] | Callable | None = None
|
68
|
+
"""List of options for the field. Only used when is_list=True. Default is an empty list."""
|
69
|
+
|
70
|
+
name: str | None = None
|
71
|
+
"""Name of the field. Default is an empty string."""
|
72
|
+
|
73
|
+
display_name: str | None = None
|
74
|
+
"""Display name of the field. Defaults to None."""
|
75
|
+
|
76
|
+
advanced: bool = False
|
77
|
+
"""Specifies if the field will an advanced parameter (hidden). Defaults to False."""
|
78
|
+
|
79
|
+
input_types: list[str] | None = None
|
80
|
+
"""List of input types for the handle when the field has more than one type. Default is an empty list."""
|
81
|
+
|
82
|
+
dynamic: bool = False
|
83
|
+
"""Specifies if the field is dynamic. Defaults to False."""
|
84
|
+
|
85
|
+
info: str | None = ""
|
86
|
+
"""Additional information about the field to be shown in the tooltip. Defaults to an empty string."""
|
87
|
+
|
88
|
+
real_time_refresh: bool | None = None
|
89
|
+
"""Specifies if the field should have real time refresh. `refresh_button` must be False. Defaults to None."""
|
90
|
+
|
91
|
+
refresh_button: bool | None = None
|
92
|
+
"""Specifies if the field should have a refresh button. Defaults to False."""
|
93
|
+
|
94
|
+
refresh_button_text: str | None = None
|
95
|
+
"""Specifies the text for the refresh button. Defaults to None."""
|
96
|
+
|
97
|
+
range_spec: RangeSpec | None = Field(default=None, serialization_alias="rangeSpec")
|
98
|
+
"""Range specification for the field. Defaults to None."""
|
99
|
+
|
100
|
+
load_from_db: bool = False
|
101
|
+
"""Specifies if the field should be loaded from the database. Defaults to False."""
|
102
|
+
|
103
|
+
title_case: bool = False
|
104
|
+
"""Specifies if the field should be displayed in title case. Defaults to True."""
|
105
|
+
|
106
|
+
def to_dict(self):
|
107
|
+
return self.model_dump(by_alias=True, exclude_none=True)
|
108
|
+
|
109
|
+
@model_serializer(mode="wrap")
|
110
|
+
def serialize_model(self, handler):
|
111
|
+
result = handler(self)
|
112
|
+
# If the field is str, we add the Text input type
|
113
|
+
if self.field_type in {"str", "Text"} and "input_types" not in result:
|
114
|
+
result["input_types"] = ["Text"]
|
115
|
+
if self.field_type == Text:
|
116
|
+
result["type"] = "str"
|
117
|
+
else:
|
118
|
+
result["type"] = self.field_type
|
119
|
+
return result
|
120
|
+
|
121
|
+
@model_validator(mode="after")
|
122
|
+
def validate_model(self):
|
123
|
+
# if field_type is int, we need to set the range_spec
|
124
|
+
if self.field_type == "int" and self.range_spec is not None:
|
125
|
+
self.range_spec = RangeSpec.set_step_type("int", self.range_spec)
|
126
|
+
return self
|
127
|
+
|
128
|
+
@field_serializer("file_path")
|
129
|
+
def serialize_file_path(self, value):
|
130
|
+
return value if self.field_type == "file" else ""
|
131
|
+
|
132
|
+
@field_serializer("field_type")
|
133
|
+
def serialize_field_type(self, value, _info):
|
134
|
+
if value is float and self.range_spec is None:
|
135
|
+
self.range_spec = RangeSpec()
|
136
|
+
return value
|
137
|
+
|
138
|
+
@field_serializer("display_name")
|
139
|
+
def serialize_display_name(self, value, _info):
|
140
|
+
# If display_name is not set, use name and convert to title case
|
141
|
+
# if title_case is True
|
142
|
+
if value is None:
|
143
|
+
# name is probably a snake_case string
|
144
|
+
# Ex: "file_path" -> "File Path"
|
145
|
+
value = self.name.replace("_", " ")
|
146
|
+
if self.title_case:
|
147
|
+
value = value.title()
|
148
|
+
return value
|
149
|
+
|
150
|
+
@field_validator("file_types")
|
151
|
+
@classmethod
|
152
|
+
def validate_file_types(cls, value):
|
153
|
+
if not isinstance(value, list):
|
154
|
+
msg = "file_types must be a list"
|
155
|
+
raise ValueError(msg) # noqa: TRY004
|
156
|
+
return [
|
157
|
+
(f".{file_type}" if isinstance(file_type, str) and not file_type.startswith(".") else file_type)
|
158
|
+
for file_type in value
|
159
|
+
]
|
160
|
+
|
161
|
+
@field_validator("field_type", mode="before")
|
162
|
+
@classmethod
|
163
|
+
def validate_type(cls, v):
|
164
|
+
# If the user passes CustomComponent as a type insteado of "CustomComponent" we need to convert it to a string
|
165
|
+
# this should be done for all types
|
166
|
+
# How to check if v is a type?
|
167
|
+
if isinstance(v, type | _GenericAlias | GenericAlias | _UnionGenericAlias):
|
168
|
+
v = post_process_type(v)[0]
|
169
|
+
v = format_type(v)
|
170
|
+
elif not isinstance(v, str):
|
171
|
+
msg = f"type must be a string or a type, not {type(v)}"
|
172
|
+
raise ValueError(msg) # noqa: TRY004
|
173
|
+
return v
|
174
|
+
|
175
|
+
|
176
|
+
class OutputOptions(BaseModel):
|
177
|
+
filter: str | None = None
|
178
|
+
"""Filter to be applied to the output data."""
|
179
|
+
|
180
|
+
|
181
|
+
class Output(BaseModel):
|
182
|
+
types: list[str] = Field(default=[])
|
183
|
+
"""List of output types for the field."""
|
184
|
+
|
185
|
+
selected: str | None = Field(default=None)
|
186
|
+
"""The selected output type for the field."""
|
187
|
+
|
188
|
+
name: str = Field(description="The name of the field.")
|
189
|
+
"""The name of the field."""
|
190
|
+
|
191
|
+
hidden: bool | None = Field(default=None)
|
192
|
+
"""Dictates if the field is hidden."""
|
193
|
+
|
194
|
+
display_name: str | None = Field(default=None)
|
195
|
+
"""The display name of the field."""
|
196
|
+
|
197
|
+
method: str | None = Field(default=None)
|
198
|
+
"""The method to use for the output."""
|
199
|
+
|
200
|
+
value: Any | None = Field(default=UNDEFINED)
|
201
|
+
"""The result of the Output. Dynamically updated as execution occurs."""
|
202
|
+
|
203
|
+
cache: bool = Field(default=True)
|
204
|
+
|
205
|
+
required_inputs: list[str] | None = Field(default=None)
|
206
|
+
"""List of required inputs for this output."""
|
207
|
+
|
208
|
+
allows_loop: bool = Field(default=False)
|
209
|
+
"""Specifies if the output allows looping."""
|
210
|
+
|
211
|
+
group_outputs: bool = Field(default=False)
|
212
|
+
"""Specifies if all outputs should be grouped and shown without dropdowns."""
|
213
|
+
|
214
|
+
options: OutputOptions | None = Field(default=None)
|
215
|
+
"""Options for the output."""
|
216
|
+
|
217
|
+
tool_mode: bool = Field(default=True)
|
218
|
+
"""Specifies if the output should be used as a tool"""
|
219
|
+
|
220
|
+
def to_dict(self):
|
221
|
+
return self.model_dump(by_alias=True, exclude_none=True)
|
222
|
+
|
223
|
+
def add_types(self, type_: list[Any]) -> None:
|
224
|
+
if self.types is None:
|
225
|
+
self.types = []
|
226
|
+
self.types.extend([t for t in type_ if t not in self.types])
|
227
|
+
# If no type is selected and we have types, select the first one
|
228
|
+
if self.selected is None and self.types:
|
229
|
+
self.selected = self.types[0]
|
230
|
+
|
231
|
+
@model_serializer(mode="wrap")
|
232
|
+
def serialize_model(self, handler):
|
233
|
+
result = handler(self)
|
234
|
+
if self.value == UNDEFINED:
|
235
|
+
result["value"] = UNDEFINED.value
|
236
|
+
return result
|
237
|
+
|
238
|
+
@model_validator(mode="after")
|
239
|
+
def validate_model(self):
|
240
|
+
if self.value == UNDEFINED.value:
|
241
|
+
self.value = UNDEFINED
|
242
|
+
if self.name is None:
|
243
|
+
msg = "name must be set"
|
244
|
+
raise ValueError(msg)
|
245
|
+
if self.display_name is None:
|
246
|
+
self.display_name = self.name
|
247
|
+
# Convert dict options to OutputOptions model
|
248
|
+
if isinstance(self.options, dict):
|
249
|
+
self.options = OutputOptions(**self.options)
|
250
|
+
return self
|
251
|
+
|
252
|
+
def apply_options(self, result):
|
253
|
+
if not self.options:
|
254
|
+
return result
|
255
|
+
if self.options.filter and isinstance(result, Data):
|
256
|
+
return result.filter_data(self.options.filter)
|
257
|
+
return result
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# This file provides backwards compatibility for prompt field constants
|
2
|
+
from lfx.template.field.base import Input
|
3
|
+
|
4
|
+
# Default input types for prompt fields
|
5
|
+
DEFAULT_PROMPT_INTUT_TYPES = ["Message"]
|
6
|
+
|
7
|
+
|
8
|
+
class DefaultPromptField(Input):
|
9
|
+
"""Default prompt field for backwards compatibility."""
|
10
|
+
|
11
|
+
field_type: str = "str"
|
12
|
+
advanced: bool = False
|
13
|
+
multiline: bool = True
|
14
|
+
input_types: list[str] = DEFAULT_PROMPT_INTUT_TYPES
|
15
|
+
value: str = "" # Set the value to empty string
|