lfx-nightly 0.2.0.dev25__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.
Potentially problematic release.
This version of lfx-nightly might be problematic. Click here for more details.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/_assets/component_index.json +1 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +375 -0
- lfx/base/agents/altk_base_agent.py +380 -0
- lfx/base/agents/altk_tool_wrappers.py +565 -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 +430 -0
- lfx/base/agents/utils.py +237 -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 +2584 -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 +810 -0
- lfx/base/data/docling_utils.py +338 -0
- lfx/base/data/storage_utils.py +192 -0
- lfx/base/data/utils.py +362 -0
- lfx/base/datastax/__init__.py +5 -0
- lfx/base/datastax/astradb_base.py +896 -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/embeddings_class.py +113 -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 +21 -0
- lfx/base/io/text.py +22 -0
- lfx/base/knowledge_bases/__init__.py +3 -0
- lfx/base/knowledge_bases/knowledge_base_utils.py +137 -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 +1659 -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 +51 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/cometapi_constants.py +54 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/google_generative_ai_model.py +38 -0
- lfx/base/models/groq_constants.py +150 -0
- lfx/base/models/groq_model_discovery.py +265 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +378 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +108 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +52 -0
- lfx/base/models/openai_constants.py +129 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/models/watsonx_constants.py +36 -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 +698 -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 +327 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +506 -0
- lfx/cli/script_loader.py +289 -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 +428 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +115 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/altk/__init__.py +34 -0
- lfx/components/altk/altk_agent.py +193 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_converse.py +195 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +130 -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 +169 -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 +169 -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/cometapi/__init__.py +32 -0
- lfx/components/cometapi/cometapi.py +166 -0
- lfx/components/composio/__init__.py +222 -0
- lfx/components/composio/agentql_composio.py +11 -0
- lfx/components/composio/agiled_composio.py +11 -0
- lfx/components/composio/airtable_composio.py +11 -0
- lfx/components/composio/apollo_composio.py +11 -0
- lfx/components/composio/asana_composio.py +11 -0
- lfx/components/composio/attio_composio.py +11 -0
- lfx/components/composio/bitbucket_composio.py +11 -0
- lfx/components/composio/bolna_composio.py +11 -0
- lfx/components/composio/brightdata_composio.py +11 -0
- lfx/components/composio/calendly_composio.py +11 -0
- lfx/components/composio/canva_composio.py +11 -0
- lfx/components/composio/canvas_composio.py +11 -0
- lfx/components/composio/coda_composio.py +11 -0
- lfx/components/composio/composio_api.py +278 -0
- lfx/components/composio/contentful_composio.py +11 -0
- lfx/components/composio/digicert_composio.py +11 -0
- lfx/components/composio/discord_composio.py +11 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/elevenlabs_composio.py +11 -0
- lfx/components/composio/exa_composio.py +11 -0
- lfx/components/composio/figma_composio.py +11 -0
- lfx/components/composio/finage_composio.py +11 -0
- lfx/components/composio/firecrawl_composio.py +11 -0
- lfx/components/composio/fireflies_composio.py +11 -0
- lfx/components/composio/fixer_composio.py +11 -0
- lfx/components/composio/flexisign_composio.py +11 -0
- lfx/components/composio/freshdesk_composio.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlebigquery_composio.py +11 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googleclassroom_composio.py +11 -0
- lfx/components/composio/googledocs_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googlesheets_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/heygen_composio.py +11 -0
- lfx/components/composio/instagram_composio.py +11 -0
- lfx/components/composio/jira_composio.py +11 -0
- lfx/components/composio/jotform_composio.py +11 -0
- lfx/components/composio/klaviyo_composio.py +11 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/listennotes_composio.py +11 -0
- lfx/components/composio/mem0_composio.py +11 -0
- lfx/components/composio/miro_composio.py +11 -0
- lfx/components/composio/missive_composio.py +11 -0
- lfx/components/composio/notion_composio.py +11 -0
- lfx/components/composio/onedrive_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/pandadoc_composio.py +11 -0
- lfx/components/composio/peopledatalabs_composio.py +11 -0
- lfx/components/composio/perplexityai_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/serpapi_composio.py +11 -0
- lfx/components/composio/slack_composio.py +11 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/snowflake_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/tavily_composio.py +11 -0
- lfx/components/composio/timelinesai_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/wrike_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 +108 -0
- lfx/components/crewai/hierarchical_crew.py +47 -0
- lfx/components/crewai/hierarchical_task.py +45 -0
- lfx/components/crewai/sequential_crew.py +53 -0
- lfx/components/crewai/sequential_task.py +74 -0
- lfx/components/crewai/sequential_task_agent.py +144 -0
- lfx/components/cuga/__init__.py +34 -0
- lfx/components/cuga/cuga_agent.py +730 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +114 -0
- lfx/components/data_source/__init__.py +58 -0
- lfx/components/data_source/api_request.py +577 -0
- lfx/components/data_source/csv_to_data.py +101 -0
- lfx/components/data_source/json_to_data.py +106 -0
- lfx/components/data_source/mock_data.py +398 -0
- lfx/components/data_source/news_search.py +166 -0
- lfx/components/data_source/rss.py +71 -0
- lfx/components/data_source/sql_executor.py +101 -0
- lfx/components/data_source/url.py +311 -0
- lfx/components/data_source/web_search.py +326 -0
- lfx/components/datastax/__init__.py +76 -0
- lfx/components/datastax/astradb_assistant_manager.py +307 -0
- lfx/components/datastax/astradb_chatmemory.py +40 -0
- lfx/components/datastax/astradb_cql.py +288 -0
- lfx/components/datastax/astradb_graph.py +217 -0
- lfx/components/datastax/astradb_tool.py +378 -0
- lfx/components/datastax/astradb_vectorize.py +122 -0
- lfx/components/datastax/astradb_vectorstore.py +449 -0
- lfx/components/datastax/create_assistant.py +59 -0
- lfx/components/datastax/create_thread.py +33 -0
- lfx/components/datastax/dotenv.py +36 -0
- lfx/components/datastax/get_assistant.py +38 -0
- lfx/components/datastax/getenvvar.py +31 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +315 -0
- lfx/components/datastax/list_assistants.py +26 -0
- lfx/components/datastax/run.py +90 -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 +238 -0
- lfx/components/docling/docling_remote.py +195 -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 +789 -0
- lfx/components/elastic/opensearch_multimodal.py +1575 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +77 -0
- lfx/components/embeddings/text_embedder.py +65 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/files_and_knowledge/__init__.py +47 -0
- lfx/components/files_and_knowledge/directory.py +113 -0
- lfx/components/files_and_knowledge/file.py +841 -0
- lfx/components/files_and_knowledge/ingestion.py +694 -0
- lfx/components/files_and_knowledge/retrieval.py +264 -0
- lfx/components/files_and_knowledge/save_file.py +746 -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/flow_controls/__init__.py +58 -0
- lfx/components/flow_controls/conditional_router.py +208 -0
- lfx/components/flow_controls/data_conditional_router.py +126 -0
- lfx/components/flow_controls/flow_tool.py +111 -0
- lfx/components/flow_controls/listen.py +29 -0
- lfx/components/flow_controls/loop.py +163 -0
- lfx/components/flow_controls/notify.py +88 -0
- lfx/components/flow_controls/pass_message.py +36 -0
- lfx/components/flow_controls/run_flow.py +108 -0
- lfx/components/flow_controls/sub_flow.py +115 -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 +193 -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 +144 -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 +143 -0
- lfx/components/helpers/__init__.py +154 -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 +199 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +207 -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 +40 -0
- lfx/components/input_output/chat.py +109 -0
- lfx/components/input_output/chat_output.py +184 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/input_output/webhook.py +56 -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/knowledge_bases/__init__.py +89 -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 +175 -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 +100 -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/llm_operations/__init__.py +46 -0
- lfx/components/llm_operations/batch_run.py +205 -0
- lfx/components/llm_operations/lambda_filter.py +218 -0
- lfx/components/llm_operations/llm_conditional_router.py +421 -0
- lfx/components/llm_operations/llm_selector.py +499 -0
- lfx/components/llm_operations/structured_output.py +244 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +133 -0
- lfx/components/logic/__init__.py +181 -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 +147 -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 +89 -0
- lfx/components/models_and_agents/__init__.py +49 -0
- lfx/components/models_and_agents/agent.py +644 -0
- lfx/components/models_and_agents/embedding_model.py +423 -0
- lfx/components/models_and_agents/language_model.py +398 -0
- lfx/components/models_and_agents/mcp_component.py +594 -0
- lfx/components/models_and_agents/memory.py +268 -0
- lfx/components/models_and_agents/prompt.py +67 -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 +151 -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 +548 -0
- lfx/components/ollama/ollama_embeddings.py +103 -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 +104 -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 +72 -0
- lfx/components/processing/alter_metadata.py +109 -0
- lfx/components/processing/combine_text.py +40 -0
- lfx/components/processing/converter.py +248 -0
- lfx/components/processing/create_data.py +111 -0
- lfx/components/processing/create_list.py +40 -0
- lfx/components/processing/data_operations.py +528 -0
- lfx/components/processing/data_to_dataframe.py +71 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/dataframe_to_toolset.py +259 -0
- lfx/components/processing/dynamic_create_data.py +357 -0
- lfx/components/processing/extract_key.py +54 -0
- lfx/components/processing/filter_data.py +43 -0
- lfx/components/processing/filter_data_values.py +89 -0
- lfx/components/processing/json_cleaner.py +104 -0
- lfx/components/processing/merge_data.py +91 -0
- lfx/components/processing/message_to_data.py +37 -0
- lfx/components/processing/output_parser.py +46 -0
- lfx/components/processing/parse_data.py +71 -0
- lfx/components/processing/parse_dataframe.py +69 -0
- lfx/components/processing/parse_json_data.py +91 -0
- lfx/components/processing/parser.py +148 -0
- lfx/components/processing/regex.py +83 -0
- lfx/components/processing/select_data.py +49 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/store_message.py +91 -0
- lfx/components/processing/update_data.py +161 -0
- lfx/components/prototypes/__init__.py +35 -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 +66 -0
- lfx/components/tools/calculator.py +109 -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 +328 -0
- lfx/components/tools/python_repl.py +98 -0
- lfx/components/tools/search_api.py +88 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +120 -0
- lfx/components/tools/tavily_search_tool.py +345 -0
- lfx/components/tools/wikidata_api.py +103 -0
- lfx/components/tools/wikipedia_api.py +50 -0
- lfx/components/tools/yahoo_finance.py +130 -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 +301 -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 +191 -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/utilities/__init__.py +43 -0
- lfx/components/utilities/calculator_core.py +89 -0
- lfx/components/utilities/current_date.py +42 -0
- lfx/components/utilities/id_generator.py +42 -0
- lfx/components/utilities/python_repl_core.py +98 -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 +34 -0
- lfx/components/vectorstores/local_db.py +270 -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/vlmrun/__init__.py +34 -0
- lfx/components/vlmrun/vlmrun_transcription.py +224 -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 +206 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +45 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +87 -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 +1890 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +650 -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 +523 -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 +216 -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 +300 -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 +2298 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +53 -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 +250 -0
- lfx/graph/utils.py +206 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +826 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +316 -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 +141 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +308 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +352 -0
- lfx/inputs/inputs.py +718 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +897 -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 +317 -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 +295 -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 +411 -0
- lfx/logging/__init__.py +11 -0
- lfx/logging/logger.py +24 -0
- lfx/memory/__init__.py +70 -0
- lfx/memory/stubs.py +302 -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/cross_module.py +80 -0
- lfx/schema/data.py +309 -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 +184 -0
- lfx/schema/json_schema.py +186 -0
- lfx/schema/log.py +62 -0
- lfx/schema/message.py +493 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +180 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +142 -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 +26 -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/database/__init__.py +5 -0
- lfx/services/database/service.py +25 -0
- lfx/services/deps.py +194 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +185 -0
- lfx/services/mcp_composer/__init__.py +6 -0
- lfx/services/mcp_composer/factory.py +16 -0
- lfx/services/mcp_composer/service.py +1441 -0
- lfx/services/schema.py +21 -0
- lfx/services/session.py +87 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +133 -0
- lfx/services/settings/base.py +668 -0
- lfx/services/settings/constants.py +43 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +11 -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 +185 -0
- lfx/services/storage/service.py +177 -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 +260 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +214 -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 +233 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +34 -0
- lfx/utils/image.py +79 -0
- lfx/utils/langflow_utils.py +52 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/ssrf_protection.py +384 -0
- lfx/utils/util.py +626 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/validate_cloud.py +26 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
- lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
- lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
- lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from pydantic import SecretStr
|
|
2
|
+
|
|
3
|
+
DEFAULT_SUPERUSER = "langflow"
|
|
4
|
+
DEFAULT_SUPERUSER_PASSWORD = SecretStr("langflow")
|
|
5
|
+
|
|
6
|
+
VARIABLES_TO_GET_FROM_ENVIRONMENT = [
|
|
7
|
+
"COMPOSIO_API_KEY",
|
|
8
|
+
"OPENAI_API_KEY",
|
|
9
|
+
"ANTHROPIC_API_KEY",
|
|
10
|
+
"GOOGLE_API_KEY",
|
|
11
|
+
"AZURE_OPENAI_API_KEY",
|
|
12
|
+
"AZURE_OPENAI_API_VERSION",
|
|
13
|
+
"AZURE_OPENAI_API_INSTANCE_NAME",
|
|
14
|
+
"AZURE_OPENAI_API_DEPLOYMENT_NAME",
|
|
15
|
+
"AZURE_OPENAI_API_EMBEDDINGS_DEPLOYMENT_NAME",
|
|
16
|
+
"ASTRA_DB_APPLICATION_TOKEN",
|
|
17
|
+
"ASTRA_DB_API_ENDPOINT",
|
|
18
|
+
"COHERE_API_KEY",
|
|
19
|
+
"GROQ_API_KEY",
|
|
20
|
+
"HUGGINGFACEHUB_API_TOKEN",
|
|
21
|
+
"PINECONE_API_KEY",
|
|
22
|
+
"SAMBANOVA_API_KEY",
|
|
23
|
+
"SEARCHAPI_API_KEY",
|
|
24
|
+
"SERPAPI_API_KEY",
|
|
25
|
+
"UPSTASH_VECTOR_REST_URL",
|
|
26
|
+
"UPSTASH_VECTOR_REST_TOKEN",
|
|
27
|
+
"VECTARA_CUSTOMER_ID",
|
|
28
|
+
"VECTARA_CORPUS_ID",
|
|
29
|
+
"VECTARA_API_KEY",
|
|
30
|
+
"AWS_ACCESS_KEY_ID",
|
|
31
|
+
"AWS_SECRET_ACCESS_KEY",
|
|
32
|
+
"NOVITA_API_KEY",
|
|
33
|
+
"TAVILY_API_KEY",
|
|
34
|
+
"COMETAPI_KEY",
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
# Agentic experience specific variables
|
|
38
|
+
AGENTIC_VARIABLES = [
|
|
39
|
+
"FLOW_ID",
|
|
40
|
+
"COMPONENT_ID",
|
|
41
|
+
"FIELD_NAME",
|
|
42
|
+
"ASTRA_TOKEN",
|
|
43
|
+
]
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from typing_extensions import override
|
|
2
|
+
|
|
3
|
+
from lfx.services.factory import ServiceFactory
|
|
4
|
+
from lfx.services.settings.service import SettingsService
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class SettingsServiceFactory(ServiceFactory):
|
|
8
|
+
_instance = None
|
|
9
|
+
|
|
10
|
+
def __new__(cls):
|
|
11
|
+
if cls._instance is None:
|
|
12
|
+
cls._instance = super().__new__(cls)
|
|
13
|
+
return cls._instance
|
|
14
|
+
|
|
15
|
+
def __init__(self) -> None:
|
|
16
|
+
super().__init__()
|
|
17
|
+
self.service_class = SettingsService
|
|
18
|
+
|
|
19
|
+
@override
|
|
20
|
+
def create(self):
|
|
21
|
+
# Here you would have logic to create and configure a SettingsService
|
|
22
|
+
|
|
23
|
+
return SettingsService.initialize()
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from lfx.services.base import Service
|
|
4
|
+
from lfx.services.settings.auth import AuthSettings
|
|
5
|
+
from lfx.services.settings.base import Settings
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SettingsService(Service):
|
|
9
|
+
name = "settings_service"
|
|
10
|
+
|
|
11
|
+
def __init__(self, settings: Settings, auth_settings: AuthSettings):
|
|
12
|
+
super().__init__()
|
|
13
|
+
self.settings: Settings = settings
|
|
14
|
+
self.auth_settings: AuthSettings = auth_settings
|
|
15
|
+
|
|
16
|
+
@classmethod
|
|
17
|
+
def initialize(cls) -> SettingsService:
|
|
18
|
+
# Check if a string is a valid path or a file name
|
|
19
|
+
|
|
20
|
+
settings = Settings()
|
|
21
|
+
if not settings.config_dir:
|
|
22
|
+
msg = "CONFIG_DIR must be set in settings"
|
|
23
|
+
raise ValueError(msg)
|
|
24
|
+
|
|
25
|
+
auth_settings = AuthSettings(
|
|
26
|
+
CONFIG_DIR=settings.config_dir,
|
|
27
|
+
)
|
|
28
|
+
return cls(settings, auth_settings)
|
|
29
|
+
|
|
30
|
+
def set(self, key, value):
|
|
31
|
+
setattr(self.settings, key, value)
|
|
32
|
+
return self.settings
|
|
33
|
+
|
|
34
|
+
async def teardown(self):
|
|
35
|
+
pass
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import platform
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
from lfx.log.logger import logger
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def set_secure_permissions(file_path: Path) -> None:
|
|
8
|
+
if platform.system() in {"Linux", "Darwin"}: # Unix/Linux/Mac
|
|
9
|
+
file_path.chmod(0o600)
|
|
10
|
+
elif platform.system() == "Windows":
|
|
11
|
+
import win32api
|
|
12
|
+
import win32con
|
|
13
|
+
import win32security
|
|
14
|
+
|
|
15
|
+
user, _, _ = win32security.LookupAccountName("", win32api.GetUserName())
|
|
16
|
+
sd = win32security.GetFileSecurity(str(file_path), win32security.DACL_SECURITY_INFORMATION)
|
|
17
|
+
dacl = win32security.ACL()
|
|
18
|
+
|
|
19
|
+
# Set the new DACL for the file: read and write access for the owner, no access for everyone else
|
|
20
|
+
dacl.AddAccessAllowedAce(
|
|
21
|
+
win32security.ACL_REVISION,
|
|
22
|
+
win32con.GENERIC_READ | win32con.GENERIC_WRITE,
|
|
23
|
+
user,
|
|
24
|
+
)
|
|
25
|
+
sd.SetSecurityDescriptorDacl(1, dacl, 0)
|
|
26
|
+
win32security.SetFileSecurity(str(file_path), win32security.DACL_SECURITY_INFORMATION, sd)
|
|
27
|
+
else:
|
|
28
|
+
logger.error("Unsupported OS")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def write_secret_to_file(path: Path, value: str) -> None:
|
|
32
|
+
path.write_text(value, encoding="utf-8")
|
|
33
|
+
try:
|
|
34
|
+
set_secure_permissions(path)
|
|
35
|
+
except Exception: # noqa: BLE001
|
|
36
|
+
logger.exception("Failed to set secure permissions on secret key")
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def read_secret_from_file(path: Path) -> str:
|
|
40
|
+
return path.read_text(encoding="utf-8")
|
|
@@ -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,185 @@
|
|
|
1
|
+
"""Local file-based storage service for lfx package."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TYPE_CHECKING
|
|
6
|
+
|
|
7
|
+
from aiofile import async_open
|
|
8
|
+
|
|
9
|
+
from lfx.log.logger import logger
|
|
10
|
+
from lfx.services.storage.service import StorageService
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from langflow.services.session.service import SessionService
|
|
14
|
+
|
|
15
|
+
from lfx.services.settings.service import SettingsService
|
|
16
|
+
|
|
17
|
+
# Constants for path parsing
|
|
18
|
+
EXPECTED_PATH_PARTS = 2 # Path format: "flow_id/filename"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class LocalStorageService(StorageService):
|
|
22
|
+
"""A service class for handling local file storage operations."""
|
|
23
|
+
|
|
24
|
+
def __init__(
|
|
25
|
+
self,
|
|
26
|
+
session_service: SessionService,
|
|
27
|
+
settings_service: SettingsService,
|
|
28
|
+
) -> None:
|
|
29
|
+
"""Initialize the local storage service.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
session_service: Session service instance
|
|
33
|
+
settings_service: Settings service instance containing configuration
|
|
34
|
+
"""
|
|
35
|
+
# Initialize base class with services
|
|
36
|
+
super().__init__(session_service, settings_service)
|
|
37
|
+
# Base class already sets self.data_dir as anyio.Path from settings_service.settings.config_dir
|
|
38
|
+
|
|
39
|
+
def resolve_component_path(self, logical_path: str) -> str:
|
|
40
|
+
"""Convert logical path to absolute filesystem path for local storage.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
logical_path: Path in format "flow_id/filename"
|
|
44
|
+
Returns:
|
|
45
|
+
str: Absolute filesystem path
|
|
46
|
+
"""
|
|
47
|
+
# Split the logical path into flow_id and filename
|
|
48
|
+
parts = logical_path.split("/", 1)
|
|
49
|
+
if len(parts) != EXPECTED_PATH_PARTS:
|
|
50
|
+
# Handle edge case - return as-is if format is unexpected
|
|
51
|
+
return logical_path
|
|
52
|
+
|
|
53
|
+
flow_id, file_name = parts
|
|
54
|
+
return self.build_full_path(flow_id, file_name)
|
|
55
|
+
|
|
56
|
+
def build_full_path(self, flow_id: str, file_name: str) -> str:
|
|
57
|
+
"""Build the full path of a file in the local storage."""
|
|
58
|
+
return str(self.data_dir / flow_id / file_name)
|
|
59
|
+
|
|
60
|
+
async def save_file(self, flow_id: str, file_name: str, data: bytes, *, append: bool = False) -> None:
|
|
61
|
+
"""Save a file in the local storage.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
flow_id: The identifier for the flow.
|
|
65
|
+
file_name: The name of the file to be saved.
|
|
66
|
+
data: The byte content of the file.
|
|
67
|
+
append: If True, append to existing file; if False, overwrite.
|
|
68
|
+
|
|
69
|
+
Raises:
|
|
70
|
+
FileNotFoundError: If the specified flow does not exist.
|
|
71
|
+
IsADirectoryError: If the file name is a directory.
|
|
72
|
+
PermissionError: If there is no permission to write the file.
|
|
73
|
+
"""
|
|
74
|
+
folder_path = self.data_dir / flow_id
|
|
75
|
+
await folder_path.mkdir(parents=True, exist_ok=True)
|
|
76
|
+
file_path = folder_path / file_name
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
mode = "ab" if append else "wb"
|
|
80
|
+
async with async_open(str(file_path), mode) as f:
|
|
81
|
+
await f.write(data)
|
|
82
|
+
action = "appended to" if append else "saved"
|
|
83
|
+
await logger.ainfo(f"File {file_name} {action} successfully in flow {flow_id}.")
|
|
84
|
+
except Exception:
|
|
85
|
+
logger.exception(f"Error saving file {file_name} in flow {flow_id}")
|
|
86
|
+
raise
|
|
87
|
+
|
|
88
|
+
async def get_file(self, flow_id: str, file_name: str) -> bytes:
|
|
89
|
+
"""Retrieve a file from the local storage.
|
|
90
|
+
|
|
91
|
+
Args:
|
|
92
|
+
flow_id: The identifier for the flow.
|
|
93
|
+
file_name: The name of the file to be retrieved.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
The byte content of the file.
|
|
97
|
+
|
|
98
|
+
Raises:
|
|
99
|
+
FileNotFoundError: If the file does not exist.
|
|
100
|
+
"""
|
|
101
|
+
file_path = self.data_dir / flow_id / file_name
|
|
102
|
+
if not await file_path.exists():
|
|
103
|
+
await logger.awarning(f"File {file_name} not found in flow {flow_id}.")
|
|
104
|
+
msg = f"File {file_name} not found in flow {flow_id}"
|
|
105
|
+
raise FileNotFoundError(msg)
|
|
106
|
+
|
|
107
|
+
async with async_open(str(file_path), "rb") as f:
|
|
108
|
+
content = await f.read()
|
|
109
|
+
|
|
110
|
+
logger.debug(f"File {file_name} retrieved successfully from flow {flow_id}.")
|
|
111
|
+
return content
|
|
112
|
+
|
|
113
|
+
async def list_files(self, flow_id: str) -> list[str]:
|
|
114
|
+
"""List all files in a specific flow directory.
|
|
115
|
+
|
|
116
|
+
Args:
|
|
117
|
+
flow_id: The identifier for the flow.
|
|
118
|
+
|
|
119
|
+
Returns:
|
|
120
|
+
List of file names in the flow directory.
|
|
121
|
+
"""
|
|
122
|
+
if not isinstance(flow_id, str):
|
|
123
|
+
flow_id = str(flow_id)
|
|
124
|
+
|
|
125
|
+
folder_path = self.data_dir / flow_id
|
|
126
|
+
if not await folder_path.exists() or not await folder_path.is_dir():
|
|
127
|
+
await logger.awarning(f"Flow {flow_id} directory does not exist.")
|
|
128
|
+
return []
|
|
129
|
+
|
|
130
|
+
try:
|
|
131
|
+
files = [p.name async for p in folder_path.iterdir() if await p.is_file()]
|
|
132
|
+
except Exception: # noqa: BLE001
|
|
133
|
+
logger.exception(f"Error listing files in flow {flow_id}")
|
|
134
|
+
return []
|
|
135
|
+
else:
|
|
136
|
+
await logger.ainfo(f"Listed {len(files)} files in flow {flow_id}.")
|
|
137
|
+
return files
|
|
138
|
+
|
|
139
|
+
async def delete_file(self, flow_id: str, file_name: str) -> None:
|
|
140
|
+
"""Delete a file from the local storage.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
flow_id: The identifier for the flow.
|
|
144
|
+
file_name: The name of the file to be deleted.
|
|
145
|
+
|
|
146
|
+
Raises:
|
|
147
|
+
FileNotFoundError: If the file does not exist.
|
|
148
|
+
"""
|
|
149
|
+
file_path = self.data_dir / flow_id / file_name
|
|
150
|
+
if await file_path.exists():
|
|
151
|
+
await file_path.unlink()
|
|
152
|
+
await logger.ainfo(f"File {file_name} deleted successfully from flow {flow_id}.")
|
|
153
|
+
else:
|
|
154
|
+
await logger.awarning(f"Attempted to delete non-existent file {file_name} in flow {flow_id}.")
|
|
155
|
+
|
|
156
|
+
async def get_file_size(self, flow_id: str, file_name: str) -> int:
|
|
157
|
+
"""Get the size of a file in bytes.
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
flow_id: The identifier for the flow.
|
|
161
|
+
file_name: The name of the file.
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
The size of the file in bytes.
|
|
165
|
+
|
|
166
|
+
Raises:
|
|
167
|
+
FileNotFoundError: If the file does not exist.
|
|
168
|
+
"""
|
|
169
|
+
file_path = self.data_dir / flow_id / file_name
|
|
170
|
+
if not await file_path.exists():
|
|
171
|
+
await logger.awarning(f"File {file_name} not found in flow {flow_id}.")
|
|
172
|
+
msg = f"File {file_name} not found in flow {flow_id}"
|
|
173
|
+
raise FileNotFoundError(msg)
|
|
174
|
+
|
|
175
|
+
try:
|
|
176
|
+
file_size_stat = await file_path.stat()
|
|
177
|
+
except Exception:
|
|
178
|
+
logger.exception(f"Error getting size of file {file_name} in flow {flow_id}")
|
|
179
|
+
raise
|
|
180
|
+
else:
|
|
181
|
+
return file_size_stat.st_size
|
|
182
|
+
|
|
183
|
+
async def teardown(self) -> None:
|
|
184
|
+
"""Perform any cleanup operations when the service is being torn down."""
|
|
185
|
+
# No specific teardown actions required for local
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from abc import abstractmethod
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
import anyio
|
|
7
|
+
|
|
8
|
+
from lfx.services.base import Service
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from collections.abc import AsyncIterator
|
|
12
|
+
|
|
13
|
+
from lfx.services.settings.service import SettingsService
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class StorageService(Service):
|
|
17
|
+
"""Abstract base class for file storage services.
|
|
18
|
+
|
|
19
|
+
This class defines the interface for file storage operations that can be
|
|
20
|
+
implemented by different backends (local filesystem, S3, etc.).
|
|
21
|
+
|
|
22
|
+
All file operations are namespaced by flow_id to isolate files between
|
|
23
|
+
different flows or users.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
name = "storage_service"
|
|
27
|
+
|
|
28
|
+
def __init__(self, session_service, settings_service: SettingsService):
|
|
29
|
+
"""Initialize the storage service.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
session_service: The session service instance
|
|
33
|
+
settings_service: The settings service instance containing configuration
|
|
34
|
+
"""
|
|
35
|
+
self.settings_service = settings_service
|
|
36
|
+
self.session_service = session_service
|
|
37
|
+
self.data_dir: anyio.Path = anyio.Path(settings_service.settings.config_dir)
|
|
38
|
+
self.set_ready()
|
|
39
|
+
|
|
40
|
+
def build_full_path(self, flow_id: str, file_name: str) -> str:
|
|
41
|
+
"""Build the full path/key for a file.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
flow_id: The flow/user identifier for namespacing
|
|
45
|
+
file_name: The name of the file
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
str: The full path or key for the file
|
|
49
|
+
"""
|
|
50
|
+
raise NotImplementedError
|
|
51
|
+
|
|
52
|
+
def resolve_component_path(self, logical_path: str) -> str:
|
|
53
|
+
"""Convert a logical path to a format that components can use directly.
|
|
54
|
+
|
|
55
|
+
Logical paths are in the format "{flow_id}/{filename}" as stored in the database.
|
|
56
|
+
This method converts them to a format appropriate for the storage backend:
|
|
57
|
+
- Local storage: Absolute filesystem path (/data_dir/flow_id/filename)
|
|
58
|
+
- S3 storage: Logical path as-is (flow_id/filename)
|
|
59
|
+
|
|
60
|
+
Components receive this resolved path and can use it without knowing the
|
|
61
|
+
storage implementation details.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
logical_path: Path in the format "flow_id/filename"
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
str: A path that components can use directly
|
|
68
|
+
"""
|
|
69
|
+
raise NotImplementedError
|
|
70
|
+
|
|
71
|
+
def set_ready(self) -> None:
|
|
72
|
+
"""Mark the service as ready."""
|
|
73
|
+
self._ready = True
|
|
74
|
+
|
|
75
|
+
@abstractmethod
|
|
76
|
+
async def save_file(self, flow_id: str, file_name: str, data: bytes, *, append: bool = False) -> None:
|
|
77
|
+
"""Save a file to storage.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
flow_id: The flow/user identifier for namespacing
|
|
81
|
+
file_name: The name of the file to save
|
|
82
|
+
data: The file content as bytes
|
|
83
|
+
append: If True, append to existing file instead of overwriting.
|
|
84
|
+
|
|
85
|
+
Raises:
|
|
86
|
+
Exception: If the file cannot be saved
|
|
87
|
+
"""
|
|
88
|
+
raise NotImplementedError
|
|
89
|
+
|
|
90
|
+
@abstractmethod
|
|
91
|
+
async def get_file(self, flow_id: str, file_name: str) -> bytes:
|
|
92
|
+
"""Retrieve a file from storage.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
flow_id: The flow/user identifier for namespacing
|
|
96
|
+
file_name: The name of the file to retrieve
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
bytes: The file content
|
|
100
|
+
|
|
101
|
+
Raises:
|
|
102
|
+
FileNotFoundError: If the file does not exist
|
|
103
|
+
"""
|
|
104
|
+
raise NotImplementedError
|
|
105
|
+
|
|
106
|
+
async def get_file_stream(self, flow_id: str, file_name: str, chunk_size: int = 8192) -> AsyncIterator[bytes]:
|
|
107
|
+
"""Retrieve a file from storage as a stream.
|
|
108
|
+
|
|
109
|
+
Default implementation loads the entire file and yields it in chunks.
|
|
110
|
+
Subclasses can override this for more efficient streaming.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
flow_id: The flow/user identifier for namespacing
|
|
114
|
+
file_name: The name of the file to retrieve
|
|
115
|
+
chunk_size: Size of chunks to yield (default: 8192 bytes)
|
|
116
|
+
|
|
117
|
+
Yields:
|
|
118
|
+
bytes: Chunks of the file content
|
|
119
|
+
|
|
120
|
+
Raises:
|
|
121
|
+
FileNotFoundError: If the file does not exist
|
|
122
|
+
"""
|
|
123
|
+
# Default implementation - subclasses can override for true streaming
|
|
124
|
+
content = await self.get_file(flow_id, file_name)
|
|
125
|
+
for i in range(0, len(content), chunk_size):
|
|
126
|
+
yield content[i : i + chunk_size]
|
|
127
|
+
|
|
128
|
+
@abstractmethod
|
|
129
|
+
async def list_files(self, flow_id: str) -> list[str]:
|
|
130
|
+
"""List all files in a flow's storage namespace.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
flow_id: The flow/user identifier for namespacing
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
list[str]: List of file names in the namespace
|
|
137
|
+
|
|
138
|
+
Raises:
|
|
139
|
+
FileNotFoundError: If the namespace directory does not exist
|
|
140
|
+
"""
|
|
141
|
+
raise NotImplementedError
|
|
142
|
+
|
|
143
|
+
@abstractmethod
|
|
144
|
+
async def get_file_size(self, flow_id: str, file_name: str) -> int:
|
|
145
|
+
"""Get the size of a file in bytes.
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
flow_id: The flow/user identifier for namespacing
|
|
149
|
+
file_name: The name of the file
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
int: Size of the file in bytes
|
|
153
|
+
|
|
154
|
+
Raises:
|
|
155
|
+
FileNotFoundError: If the file does not exist
|
|
156
|
+
"""
|
|
157
|
+
raise NotImplementedError
|
|
158
|
+
|
|
159
|
+
@abstractmethod
|
|
160
|
+
async def delete_file(self, flow_id: str, file_name: str) -> None:
|
|
161
|
+
"""Delete a file from storage.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
flow_id: The flow/user identifier for namespacing
|
|
165
|
+
file_name: The name of the file to delete
|
|
166
|
+
|
|
167
|
+
Note:
|
|
168
|
+
Should not raise an error if the file doesn't exist
|
|
169
|
+
"""
|
|
170
|
+
raise NotImplementedError
|
|
171
|
+
|
|
172
|
+
async def teardown(self) -> None:
|
|
173
|
+
"""Perform cleanup operations when the service is being shut down.
|
|
174
|
+
|
|
175
|
+
Subclasses should override this to clean up any resources (connections, etc.)
|
|
176
|
+
"""
|
|
177
|
+
raise NotImplementedError
|
|
@@ -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
|