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/services/manager.py
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
"""ServiceManager extracted from langflow for lfx package.
|
2
|
+
|
3
|
+
This maintains the same API and most of the functionality, but removes
|
4
|
+
langflow-specific auto-discovery to break dependencies.
|
5
|
+
"""
|
6
|
+
|
7
|
+
from __future__ import annotations
|
8
|
+
|
9
|
+
import asyncio
|
10
|
+
import importlib
|
11
|
+
import inspect
|
12
|
+
import threading
|
13
|
+
from typing import TYPE_CHECKING
|
14
|
+
|
15
|
+
from lfx.log.logger import logger
|
16
|
+
from lfx.services.schema import ServiceType
|
17
|
+
|
18
|
+
if TYPE_CHECKING:
|
19
|
+
from lfx.services.base import Service
|
20
|
+
from lfx.services.factory import ServiceFactory
|
21
|
+
|
22
|
+
|
23
|
+
class NoFactoryRegisteredError(Exception):
|
24
|
+
pass
|
25
|
+
|
26
|
+
|
27
|
+
class ServiceManager:
|
28
|
+
"""Manages the creation of different services."""
|
29
|
+
|
30
|
+
def __init__(self) -> None:
|
31
|
+
self.services: dict[str, Service] = {}
|
32
|
+
self.factories: dict[str, ServiceFactory] = {}
|
33
|
+
self._lock = threading.RLock()
|
34
|
+
self.factory_registered = False
|
35
|
+
from lfx.services.settings.factory import SettingsServiceFactory
|
36
|
+
|
37
|
+
self.register_factory(SettingsServiceFactory())
|
38
|
+
|
39
|
+
def register_factories(self, factories: list[ServiceFactory] | None = None) -> None:
|
40
|
+
"""Register all available service factories."""
|
41
|
+
if factories is None:
|
42
|
+
return
|
43
|
+
for factory in factories:
|
44
|
+
try:
|
45
|
+
self.register_factory(factory)
|
46
|
+
except Exception: # noqa: BLE001
|
47
|
+
logger.exception(f"Error initializing {factory}")
|
48
|
+
self.set_factory_registered()
|
49
|
+
|
50
|
+
def are_factories_registered(self) -> bool:
|
51
|
+
"""Check if the factory is registered."""
|
52
|
+
return self.factory_registered
|
53
|
+
|
54
|
+
def set_factory_registered(self) -> None:
|
55
|
+
"""Set the factory registered flag."""
|
56
|
+
self.factory_registered = True
|
57
|
+
|
58
|
+
def register_factory(
|
59
|
+
self,
|
60
|
+
service_factory: ServiceFactory,
|
61
|
+
) -> None:
|
62
|
+
"""Registers a new factory with dependencies."""
|
63
|
+
service_name = service_factory.service_class.name
|
64
|
+
self.factories[service_name] = service_factory
|
65
|
+
|
66
|
+
def get(self, service_name: ServiceType, default: ServiceFactory | None = None) -> Service:
|
67
|
+
"""Get (or create) a service by its name."""
|
68
|
+
with self._lock:
|
69
|
+
if service_name not in self.services:
|
70
|
+
self._create_service(service_name, default)
|
71
|
+
return self.services[service_name]
|
72
|
+
|
73
|
+
def _create_service(self, service_name: ServiceType, default: ServiceFactory | None = None) -> None:
|
74
|
+
"""Create a new service given its name, handling dependencies."""
|
75
|
+
logger.debug(f"Create service {service_name}")
|
76
|
+
self._validate_service_creation(service_name, default)
|
77
|
+
|
78
|
+
if service_name == ServiceType.SETTINGS_SERVICE:
|
79
|
+
from lfx.services.settings.factory import SettingsServiceFactory
|
80
|
+
|
81
|
+
factory = SettingsServiceFactory()
|
82
|
+
if factory not in self.factories:
|
83
|
+
self.register_factory(factory)
|
84
|
+
else:
|
85
|
+
factory = self.factories.get(service_name)
|
86
|
+
|
87
|
+
# Create dependencies first
|
88
|
+
if factory is None and default is not None:
|
89
|
+
self.register_factory(default)
|
90
|
+
factory = default
|
91
|
+
if factory is None:
|
92
|
+
msg = f"No factory registered for {service_name}"
|
93
|
+
raise NoFactoryRegisteredError(msg)
|
94
|
+
for dependency in factory.dependencies:
|
95
|
+
if dependency not in self.services:
|
96
|
+
self._create_service(dependency)
|
97
|
+
|
98
|
+
# Collect the dependent services
|
99
|
+
dependent_services = {dep.value: self.services[dep] for dep in factory.dependencies}
|
100
|
+
|
101
|
+
# Create the actual service
|
102
|
+
self.services[service_name] = self.factories[service_name].create(**dependent_services)
|
103
|
+
self.services[service_name].set_ready()
|
104
|
+
|
105
|
+
def _validate_service_creation(self, service_name: ServiceType, default: ServiceFactory | None = None) -> None:
|
106
|
+
"""Validate whether the service can be created."""
|
107
|
+
if service_name == ServiceType.SETTINGS_SERVICE:
|
108
|
+
return
|
109
|
+
if service_name not in self.factories and default is None:
|
110
|
+
msg = f"No factory registered for the service class '{service_name.name}'"
|
111
|
+
raise NoFactoryRegisteredError(msg)
|
112
|
+
|
113
|
+
def update(self, service_name: ServiceType) -> None:
|
114
|
+
"""Update a service by its name."""
|
115
|
+
if service_name in self.services:
|
116
|
+
logger.debug(f"Update service {service_name}")
|
117
|
+
self.services.pop(service_name, None)
|
118
|
+
self.get(service_name)
|
119
|
+
|
120
|
+
async def teardown(self) -> None:
|
121
|
+
"""Teardown all the services."""
|
122
|
+
for service in list(self.services.values()):
|
123
|
+
if service is None:
|
124
|
+
continue
|
125
|
+
logger.debug(f"Teardown service {service.name}")
|
126
|
+
try:
|
127
|
+
teardown_result = service.teardown()
|
128
|
+
if asyncio.iscoroutine(teardown_result):
|
129
|
+
await teardown_result
|
130
|
+
except Exception as exc: # noqa: BLE001
|
131
|
+
logger.debug(f"Error in teardown of {service.name}", exc_info=exc)
|
132
|
+
self.services = {}
|
133
|
+
self.factories = {}
|
134
|
+
|
135
|
+
@classmethod
|
136
|
+
def get_factories(cls) -> list[ServiceFactory]:
|
137
|
+
"""Auto-discover and return all service factories."""
|
138
|
+
from lfx.services.factory import ServiceFactory
|
139
|
+
from lfx.services.schema import ServiceType
|
140
|
+
|
141
|
+
service_names = [ServiceType(service_type).value.replace("_service", "") for service_type in ServiceType]
|
142
|
+
base_module = "lfx.services"
|
143
|
+
factories = []
|
144
|
+
|
145
|
+
for name in service_names:
|
146
|
+
try:
|
147
|
+
module_name = f"{base_module}.{name}.factory"
|
148
|
+
module = importlib.import_module(module_name)
|
149
|
+
|
150
|
+
# Find all classes in the module that are subclasses of ServiceFactory
|
151
|
+
for _, obj in inspect.getmembers(module, inspect.isclass):
|
152
|
+
if issubclass(obj, ServiceFactory) and obj is not ServiceFactory:
|
153
|
+
factories.append(obj())
|
154
|
+
break
|
155
|
+
|
156
|
+
except Exception as exc: # noqa: BLE001
|
157
|
+
logger.debug(
|
158
|
+
f"Could not initialize services. Please check your settings. Error in {name}.", exc_info=exc
|
159
|
+
)
|
160
|
+
|
161
|
+
return factories
|
162
|
+
|
163
|
+
|
164
|
+
# Global service manager instance
|
165
|
+
_service_manager = None
|
166
|
+
|
167
|
+
|
168
|
+
def get_service_manager():
|
169
|
+
global _service_manager # noqa: PLW0603
|
170
|
+
if _service_manager is None:
|
171
|
+
_service_manager = ServiceManager()
|
172
|
+
return _service_manager
|
lfx/services/schema.py
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
"""Service schema definitions for lfx package."""
|
2
|
+
|
3
|
+
from enum import Enum
|
4
|
+
|
5
|
+
|
6
|
+
class ServiceType(str, Enum):
|
7
|
+
DATABASE_SERVICE = "database_service"
|
8
|
+
STORAGE_SERVICE = "storage_service"
|
9
|
+
SETTINGS_SERVICE = "settings_service"
|
10
|
+
VARIABLE_SERVICE = "variable_service"
|
11
|
+
CACHE_SERVICE = "cache_service"
|
12
|
+
TELEMETRY_SERVICE = "telemetry_service"
|
13
|
+
TRACING_SERVICE = "tracing_service"
|
14
|
+
STATE_SERVICE = "state_service"
|
15
|
+
SESSION_SERVICE = "session_service"
|
16
|
+
CHAT_SERVICE = "chat_service"
|
17
|
+
TASK_SERVICE = "task_service"
|
18
|
+
STORE_SERVICE = "store_service"
|
19
|
+
JOB_QUEUE_SERVICE = "job_queue_service"
|
20
|
+
SHARED_COMPONENT_CACHE_SERVICE = "shared_component_cache_service"
|
lfx/services/session.py
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
"""Lightweight session implementations for lfx package."""
|
2
|
+
|
3
|
+
|
4
|
+
class NoopSession:
|
5
|
+
"""No-operation session that implements the database session interface.
|
6
|
+
|
7
|
+
This provides a complete database session API but all operations are no-ops.
|
8
|
+
Perfect for testing or when no real database is available.
|
9
|
+
"""
|
10
|
+
|
11
|
+
class NoopBind:
|
12
|
+
class NoopConnect:
|
13
|
+
async def __aenter__(self):
|
14
|
+
return self
|
15
|
+
|
16
|
+
async def __aexit__(self, exc_type, exc, tb):
|
17
|
+
pass
|
18
|
+
|
19
|
+
async def run_sync(self, fn, *args, **kwargs): # noqa: ARG002
|
20
|
+
return None
|
21
|
+
|
22
|
+
def connect(self):
|
23
|
+
return self.NoopConnect()
|
24
|
+
|
25
|
+
bind = NoopBind()
|
26
|
+
|
27
|
+
async def add(self, *args, **kwargs):
|
28
|
+
pass
|
29
|
+
|
30
|
+
async def commit(self):
|
31
|
+
pass
|
32
|
+
|
33
|
+
async def rollback(self):
|
34
|
+
pass
|
35
|
+
|
36
|
+
async def execute(self, *args, **kwargs): # noqa: ARG002
|
37
|
+
return None
|
38
|
+
|
39
|
+
async def query(self, *args, **kwargs): # noqa: ARG002
|
40
|
+
return []
|
41
|
+
|
42
|
+
async def close(self):
|
43
|
+
pass
|
44
|
+
|
45
|
+
async def refresh(self, *args, **kwargs):
|
46
|
+
pass
|
47
|
+
|
48
|
+
async def delete(self, *args, **kwargs):
|
49
|
+
pass
|
50
|
+
|
51
|
+
async def __aenter__(self):
|
52
|
+
return self
|
53
|
+
|
54
|
+
async def __aexit__(self, exc_type, exc, tb):
|
55
|
+
pass
|
56
|
+
|
57
|
+
async def get(self, *args, **kwargs): # noqa: ARG002
|
58
|
+
return None
|
59
|
+
|
60
|
+
async def exec(self, *args, **kwargs): # noqa: ARG002
|
61
|
+
class _NoopResult:
|
62
|
+
def first(self):
|
63
|
+
return None
|
64
|
+
|
65
|
+
def all(self):
|
66
|
+
return []
|
67
|
+
|
68
|
+
def one_or_none(self):
|
69
|
+
return None
|
70
|
+
|
71
|
+
return _NoopResult()
|
72
|
+
|
73
|
+
@property
|
74
|
+
def no_autoflush(self):
|
75
|
+
"""Context manager that disables autoflush (no-op implementation)."""
|
76
|
+
return self
|
77
|
+
|
78
|
+
def __enter__(self):
|
79
|
+
return self
|
80
|
+
|
81
|
+
def __exit__(self, exc_type, exc, tb):
|
82
|
+
pass
|
@@ -0,0 +1,130 @@
|
|
1
|
+
import secrets
|
2
|
+
from pathlib import Path
|
3
|
+
from typing import Literal
|
4
|
+
|
5
|
+
from passlib.context import CryptContext
|
6
|
+
from pydantic import Field, SecretStr, field_validator
|
7
|
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
8
|
+
|
9
|
+
from lfx.log.logger import logger
|
10
|
+
from lfx.services.settings.constants import DEFAULT_SUPERUSER, DEFAULT_SUPERUSER_PASSWORD
|
11
|
+
from lfx.services.settings.utils import read_secret_from_file, write_secret_to_file
|
12
|
+
|
13
|
+
|
14
|
+
class AuthSettings(BaseSettings):
|
15
|
+
# Login settings
|
16
|
+
CONFIG_DIR: str
|
17
|
+
SECRET_KEY: SecretStr = Field(
|
18
|
+
default=SecretStr(""),
|
19
|
+
description="Secret key for JWT. If not provided, a random one will be generated.",
|
20
|
+
frozen=False,
|
21
|
+
)
|
22
|
+
ALGORITHM: str = "HS256"
|
23
|
+
ACCESS_TOKEN_EXPIRE_SECONDS: int = 60 * 60 # 1 hour
|
24
|
+
REFRESH_TOKEN_EXPIRE_SECONDS: int = 60 * 60 * 24 * 7 # 7 days
|
25
|
+
|
26
|
+
# API Key to execute /process endpoint
|
27
|
+
API_KEY_ALGORITHM: str = "HS256"
|
28
|
+
API_V1_STR: str = "/api/v1"
|
29
|
+
|
30
|
+
AUTO_LOGIN: bool = Field(
|
31
|
+
default=True, # TODO: Set to False in v1.6
|
32
|
+
description=(
|
33
|
+
"Enable automatic login with default credentials. "
|
34
|
+
"SECURITY WARNING: This bypasses authentication and should only be used in development environments. "
|
35
|
+
"Set to False in production."
|
36
|
+
),
|
37
|
+
)
|
38
|
+
"""If True, the application will attempt to log in automatically as a super user."""
|
39
|
+
skip_auth_auto_login: bool = True
|
40
|
+
"""If True, the application will skip authentication when AUTO_LOGIN is enabled.
|
41
|
+
This will be removed in v1.6"""
|
42
|
+
|
43
|
+
WEBHOOK_AUTH_ENABLE: bool = False
|
44
|
+
"""If True, webhook endpoints will require API key authentication.
|
45
|
+
If False, webhooks run as flow owner without authentication."""
|
46
|
+
|
47
|
+
ENABLE_SUPERUSER_CLI: bool = Field(
|
48
|
+
default=True,
|
49
|
+
description="Allow creation of superusers via CLI. Set to False in production for security.",
|
50
|
+
)
|
51
|
+
"""If True, allows creation of superusers via the CLI 'langflow superuser' command."""
|
52
|
+
|
53
|
+
NEW_USER_IS_ACTIVE: bool = False
|
54
|
+
SUPERUSER: str = DEFAULT_SUPERUSER
|
55
|
+
SUPERUSER_PASSWORD: str = DEFAULT_SUPERUSER_PASSWORD
|
56
|
+
|
57
|
+
REFRESH_SAME_SITE: Literal["lax", "strict", "none"] = "none"
|
58
|
+
"""The SameSite attribute of the refresh token cookie."""
|
59
|
+
REFRESH_SECURE: bool = True
|
60
|
+
"""The Secure attribute of the refresh token cookie."""
|
61
|
+
REFRESH_HTTPONLY: bool = True
|
62
|
+
"""The HttpOnly attribute of the refresh token cookie."""
|
63
|
+
ACCESS_SAME_SITE: Literal["lax", "strict", "none"] = "lax"
|
64
|
+
"""The SameSite attribute of the access token cookie."""
|
65
|
+
ACCESS_SECURE: bool = False
|
66
|
+
"""The Secure attribute of the access token cookie."""
|
67
|
+
ACCESS_HTTPONLY: bool = False
|
68
|
+
"""The HttpOnly attribute of the access token cookie."""
|
69
|
+
|
70
|
+
COOKIE_DOMAIN: str | None = None
|
71
|
+
"""The domain attribute of the cookies. If None, the domain is not set."""
|
72
|
+
|
73
|
+
pwd_context: CryptContext = CryptContext(schemes=["bcrypt"], deprecated="auto")
|
74
|
+
|
75
|
+
model_config = SettingsConfigDict(validate_assignment=True, extra="ignore", env_prefix="LANGFLOW_")
|
76
|
+
|
77
|
+
def reset_credentials(self) -> None:
|
78
|
+
self.SUPERUSER = DEFAULT_SUPERUSER
|
79
|
+
self.SUPERUSER_PASSWORD = DEFAULT_SUPERUSER_PASSWORD
|
80
|
+
|
81
|
+
# If autologin is true, then we need to set the credentials to
|
82
|
+
# the default values
|
83
|
+
# so we need to validate the superuser and superuser_password
|
84
|
+
# fields
|
85
|
+
@field_validator("SUPERUSER", "SUPERUSER_PASSWORD", mode="before")
|
86
|
+
@classmethod
|
87
|
+
def validate_superuser(cls, value, info):
|
88
|
+
if info.data.get("AUTO_LOGIN"):
|
89
|
+
if value != DEFAULT_SUPERUSER:
|
90
|
+
value = DEFAULT_SUPERUSER
|
91
|
+
logger.debug("Resetting superuser to default value")
|
92
|
+
if info.data.get("SUPERUSER_PASSWORD") != DEFAULT_SUPERUSER_PASSWORD:
|
93
|
+
info.data["SUPERUSER_PASSWORD"] = DEFAULT_SUPERUSER_PASSWORD
|
94
|
+
logger.debug("Resetting superuser password to default value")
|
95
|
+
|
96
|
+
return value
|
97
|
+
|
98
|
+
return value
|
99
|
+
|
100
|
+
@field_validator("SECRET_KEY", mode="before")
|
101
|
+
@classmethod
|
102
|
+
def get_secret_key(cls, value, info):
|
103
|
+
config_dir = info.data.get("CONFIG_DIR")
|
104
|
+
|
105
|
+
if not config_dir:
|
106
|
+
logger.debug("No CONFIG_DIR provided, not saving secret key")
|
107
|
+
return value or secrets.token_urlsafe(32)
|
108
|
+
|
109
|
+
secret_key_path = Path(config_dir) / "secret_key"
|
110
|
+
|
111
|
+
if value:
|
112
|
+
logger.debug("Secret key provided")
|
113
|
+
secret_value = value.get_secret_value() if isinstance(value, SecretStr) else value
|
114
|
+
write_secret_to_file(secret_key_path, secret_value)
|
115
|
+
else:
|
116
|
+
logger.debug("No secret key provided, generating a random one")
|
117
|
+
|
118
|
+
if secret_key_path.exists():
|
119
|
+
value = read_secret_from_file(secret_key_path)
|
120
|
+
logger.debug("Loaded secret key")
|
121
|
+
if not value:
|
122
|
+
value = secrets.token_urlsafe(32)
|
123
|
+
write_secret_to_file(secret_key_path, value)
|
124
|
+
logger.debug("Saved secret key")
|
125
|
+
else:
|
126
|
+
value = secrets.token_urlsafe(32)
|
127
|
+
write_secret_to_file(secret_key_path, value)
|
128
|
+
logger.debug("Saved secret key")
|
129
|
+
|
130
|
+
return value if isinstance(value, SecretStr) else SecretStr(value).get_secret_value()
|