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/utils/util.py
ADDED
@@ -0,0 +1,481 @@
|
|
1
|
+
import difflib
|
2
|
+
import importlib
|
3
|
+
import inspect
|
4
|
+
import json
|
5
|
+
import re
|
6
|
+
from functools import wraps
|
7
|
+
from pathlib import Path
|
8
|
+
from typing import Any
|
9
|
+
|
10
|
+
from docstring_parser import parse
|
11
|
+
|
12
|
+
from lfx.log.logger import logger
|
13
|
+
from lfx.schema.data import Data
|
14
|
+
from lfx.services.deps import get_settings_service
|
15
|
+
from lfx.template.frontend_node.constants import FORCE_SHOW_FIELDS
|
16
|
+
from lfx.utils import constants
|
17
|
+
|
18
|
+
|
19
|
+
def unescape_string(s: str):
|
20
|
+
# Replace escaped new line characters with actual new line characters
|
21
|
+
return s.replace("\\n", "\n")
|
22
|
+
|
23
|
+
|
24
|
+
def remove_ansi_escape_codes(text):
|
25
|
+
return re.sub(r"\x1b\[[0-9;]*[a-zA-Z]", "", text)
|
26
|
+
|
27
|
+
|
28
|
+
def build_template_from_function(name: str, type_to_loader_dict: dict, *, add_function: bool = False):
|
29
|
+
classes = [item.__annotations__["return"].__name__ for item in type_to_loader_dict.values()]
|
30
|
+
|
31
|
+
# Raise error if name is not in chains
|
32
|
+
if name not in classes:
|
33
|
+
msg = f"{name} not found"
|
34
|
+
raise ValueError(msg)
|
35
|
+
|
36
|
+
for _type, v in type_to_loader_dict.items():
|
37
|
+
if v.__annotations__["return"].__name__ == name:
|
38
|
+
class_ = v.__annotations__["return"]
|
39
|
+
|
40
|
+
# Get the docstring
|
41
|
+
docs = parse(class_.__doc__)
|
42
|
+
|
43
|
+
variables = {"_type": _type}
|
44
|
+
for class_field_items, value in class_.model_fields.items():
|
45
|
+
if class_field_items == "callback_manager":
|
46
|
+
continue
|
47
|
+
variables[class_field_items] = {}
|
48
|
+
for name_, value_ in value.__repr_args__():
|
49
|
+
if name_ == "default_factory":
|
50
|
+
try:
|
51
|
+
variables[class_field_items]["default"] = get_default_factory(
|
52
|
+
module=class_.__base__.__module__, function=value_
|
53
|
+
)
|
54
|
+
except Exception: # noqa: BLE001
|
55
|
+
logger.debug(f"Error getting default factory for {value_}", exc_info=True)
|
56
|
+
variables[class_field_items]["default"] = None
|
57
|
+
elif name_ != "name":
|
58
|
+
variables[class_field_items][name_] = value_
|
59
|
+
|
60
|
+
variables[class_field_items]["placeholder"] = docs.params.get(class_field_items, "")
|
61
|
+
# Adding function to base classes to allow
|
62
|
+
# the output to be a function
|
63
|
+
base_classes = get_base_classes(class_)
|
64
|
+
if add_function:
|
65
|
+
base_classes.append("Callable")
|
66
|
+
|
67
|
+
return {
|
68
|
+
"template": format_dict(variables, name),
|
69
|
+
"description": docs.short_description or "",
|
70
|
+
"base_classes": base_classes,
|
71
|
+
}
|
72
|
+
return None
|
73
|
+
|
74
|
+
|
75
|
+
def build_template_from_method(
|
76
|
+
class_name: str,
|
77
|
+
method_name: str,
|
78
|
+
type_to_cls_dict: dict,
|
79
|
+
*,
|
80
|
+
add_function: bool = False,
|
81
|
+
):
|
82
|
+
classes = [item.__name__ for item in type_to_cls_dict.values()]
|
83
|
+
|
84
|
+
# Raise error if class_name is not in classes
|
85
|
+
if class_name not in classes:
|
86
|
+
msg = f"{class_name} not found."
|
87
|
+
raise ValueError(msg)
|
88
|
+
|
89
|
+
for _type, v in type_to_cls_dict.items():
|
90
|
+
if v.__name__ == class_name:
|
91
|
+
class_ = v
|
92
|
+
|
93
|
+
# Check if the method exists in this class
|
94
|
+
if not hasattr(class_, method_name):
|
95
|
+
msg = f"Method {method_name} not found in class {class_name}"
|
96
|
+
raise ValueError(msg)
|
97
|
+
|
98
|
+
# Get the method
|
99
|
+
method = getattr(class_, method_name)
|
100
|
+
|
101
|
+
# Get the docstring
|
102
|
+
docs = parse(method.__doc__)
|
103
|
+
|
104
|
+
# Get the signature of the method
|
105
|
+
sig = inspect.signature(method)
|
106
|
+
|
107
|
+
# Get the parameters of the method
|
108
|
+
params = sig.parameters
|
109
|
+
|
110
|
+
# Initialize the variables dictionary with method parameters
|
111
|
+
variables = {
|
112
|
+
"_type": _type,
|
113
|
+
**{
|
114
|
+
name: {
|
115
|
+
"default": (param.default if param.default != param.empty else None),
|
116
|
+
"type": (param.annotation if param.annotation != param.empty else None),
|
117
|
+
"required": param.default == param.empty,
|
118
|
+
}
|
119
|
+
for name, param in params.items()
|
120
|
+
if name not in {"self", "kwargs", "args"}
|
121
|
+
},
|
122
|
+
}
|
123
|
+
|
124
|
+
base_classes = get_base_classes(class_)
|
125
|
+
|
126
|
+
# Adding function to base classes to allow the output to be a function
|
127
|
+
if add_function:
|
128
|
+
base_classes.append("Callable")
|
129
|
+
|
130
|
+
return {
|
131
|
+
"template": format_dict(variables, class_name),
|
132
|
+
"description": docs.short_description or "",
|
133
|
+
"base_classes": base_classes,
|
134
|
+
}
|
135
|
+
return None
|
136
|
+
|
137
|
+
|
138
|
+
def get_base_classes(cls):
|
139
|
+
"""Get the base classes of a class.
|
140
|
+
|
141
|
+
These are used to determine the output of the nodes.
|
142
|
+
"""
|
143
|
+
if hasattr(cls, "__bases__") and cls.__bases__:
|
144
|
+
bases = cls.__bases__
|
145
|
+
result = []
|
146
|
+
for base in bases:
|
147
|
+
if any(_type in base.__module__ for _type in ["pydantic", "abc"]):
|
148
|
+
continue
|
149
|
+
result.append(base.__name__)
|
150
|
+
base_classes = get_base_classes(base)
|
151
|
+
# check if the base_classes are in the result
|
152
|
+
# if not, add them
|
153
|
+
for base_class in base_classes:
|
154
|
+
if base_class not in result:
|
155
|
+
result.append(base_class)
|
156
|
+
else:
|
157
|
+
result = [cls.__name__]
|
158
|
+
if not result:
|
159
|
+
result = [cls.__name__]
|
160
|
+
return list({*result, cls.__name__})
|
161
|
+
|
162
|
+
|
163
|
+
def get_default_factory(module: str, function: str):
|
164
|
+
pattern = r"<function (\w+)>"
|
165
|
+
|
166
|
+
if match := re.search(pattern, function):
|
167
|
+
import warnings
|
168
|
+
|
169
|
+
with warnings.catch_warnings():
|
170
|
+
warnings.filterwarnings(
|
171
|
+
"ignore", message="Support for class-based `config` is deprecated", category=DeprecationWarning
|
172
|
+
)
|
173
|
+
warnings.filterwarnings("ignore", message="Valid config keys have changed in V2", category=UserWarning)
|
174
|
+
imported_module = importlib.import_module(module)
|
175
|
+
return getattr(imported_module, match[1])()
|
176
|
+
return None
|
177
|
+
|
178
|
+
|
179
|
+
def update_verbose(d: dict, *, new_value: bool) -> dict:
|
180
|
+
"""Recursively updates the value of the 'verbose' key in a dictionary.
|
181
|
+
|
182
|
+
Args:
|
183
|
+
d: the dictionary to update
|
184
|
+
new_value: the new value to set
|
185
|
+
|
186
|
+
Returns:
|
187
|
+
The updated dictionary.
|
188
|
+
"""
|
189
|
+
for k, v in d.items():
|
190
|
+
if isinstance(v, dict):
|
191
|
+
update_verbose(v, new_value=new_value)
|
192
|
+
elif k == "verbose":
|
193
|
+
d[k] = new_value
|
194
|
+
return d
|
195
|
+
|
196
|
+
|
197
|
+
def sync_to_async(func):
|
198
|
+
"""Decorator to convert a sync function to an async function."""
|
199
|
+
|
200
|
+
@wraps(func)
|
201
|
+
async def async_wrapper(*args, **kwargs):
|
202
|
+
return func(*args, **kwargs)
|
203
|
+
|
204
|
+
return async_wrapper
|
205
|
+
|
206
|
+
|
207
|
+
def format_dict(dictionary: dict[str, Any], class_name: str | None = None) -> dict[str, Any]:
|
208
|
+
"""Formats a dictionary by removing certain keys and modifying the values of other keys.
|
209
|
+
|
210
|
+
Returns:
|
211
|
+
A new dictionary with the desired modifications applied.
|
212
|
+
"""
|
213
|
+
for key, value in dictionary.items():
|
214
|
+
if key == "_type":
|
215
|
+
continue
|
216
|
+
|
217
|
+
type_: str | type = get_type(value)
|
218
|
+
|
219
|
+
if "BaseModel" in str(type_):
|
220
|
+
continue
|
221
|
+
|
222
|
+
type_ = remove_optional_wrapper(type_)
|
223
|
+
type_ = check_list_type(type_, value)
|
224
|
+
type_ = replace_mapping_with_dict(type_)
|
225
|
+
type_ = get_type_from_union_literal(type_)
|
226
|
+
|
227
|
+
value["type"] = get_formatted_type(key, type_)
|
228
|
+
value["show"] = should_show_field(value, key)
|
229
|
+
value["password"] = is_password_field(key)
|
230
|
+
value["multiline"] = is_multiline_field(key)
|
231
|
+
|
232
|
+
if key == "dict_":
|
233
|
+
set_dict_file_attributes(value)
|
234
|
+
|
235
|
+
replace_default_value_with_actual(value)
|
236
|
+
|
237
|
+
if key == "headers":
|
238
|
+
set_headers_value(value)
|
239
|
+
|
240
|
+
add_options_to_field(value, class_name, key)
|
241
|
+
|
242
|
+
return dictionary
|
243
|
+
|
244
|
+
|
245
|
+
# "Union[Literal['f-string'], Literal['jinja2']]" -> "str"
|
246
|
+
def get_type_from_union_literal(union_literal: str) -> str:
|
247
|
+
# if types are literal strings
|
248
|
+
# the type is a string
|
249
|
+
if "Literal" in union_literal:
|
250
|
+
return "str"
|
251
|
+
return union_literal
|
252
|
+
|
253
|
+
|
254
|
+
def get_type(value: Any) -> str | type:
|
255
|
+
"""Retrieves the type value from the dictionary.
|
256
|
+
|
257
|
+
Returns:
|
258
|
+
The type value.
|
259
|
+
"""
|
260
|
+
# get "type" or "annotation" from the value
|
261
|
+
type_ = value.get("type") or value.get("annotation")
|
262
|
+
|
263
|
+
return type_ if isinstance(type_, str) else type_.__name__
|
264
|
+
|
265
|
+
|
266
|
+
def remove_optional_wrapper(type_: str | type) -> str:
|
267
|
+
"""Removes the 'Optional' wrapper from the type string.
|
268
|
+
|
269
|
+
Returns:
|
270
|
+
The type string with the 'Optional' wrapper removed.
|
271
|
+
"""
|
272
|
+
if isinstance(type_, type):
|
273
|
+
type_ = str(type_)
|
274
|
+
if "Optional" in type_:
|
275
|
+
type_ = type_.replace("Optional[", "")[:-1]
|
276
|
+
|
277
|
+
return type_
|
278
|
+
|
279
|
+
|
280
|
+
def check_list_type(type_: str, value: dict[str, Any]) -> str:
|
281
|
+
"""Checks if the type is a list type and modifies the value accordingly.
|
282
|
+
|
283
|
+
Returns:
|
284
|
+
The modified type string.
|
285
|
+
"""
|
286
|
+
if any(list_type in type_ for list_type in ["List", "Sequence", "Set"]):
|
287
|
+
type_ = type_.replace("List[", "").replace("Sequence[", "").replace("Set[", "")[:-1]
|
288
|
+
value["list"] = True
|
289
|
+
else:
|
290
|
+
value["list"] = False
|
291
|
+
|
292
|
+
return type_
|
293
|
+
|
294
|
+
|
295
|
+
def replace_mapping_with_dict(type_: str) -> str:
|
296
|
+
"""Replaces 'Mapping' with 'dict' in the type string.
|
297
|
+
|
298
|
+
Returns:
|
299
|
+
The modified type string.
|
300
|
+
"""
|
301
|
+
if "Mapping" in type_:
|
302
|
+
type_ = type_.replace("Mapping", "dict")
|
303
|
+
|
304
|
+
return type_
|
305
|
+
|
306
|
+
|
307
|
+
def get_formatted_type(key: str, type_: str) -> str:
|
308
|
+
"""Formats the type value based on the given key.
|
309
|
+
|
310
|
+
Returns:
|
311
|
+
The formatted type value.
|
312
|
+
"""
|
313
|
+
if key == "allowed_tools":
|
314
|
+
return "Tool"
|
315
|
+
|
316
|
+
if key == "max_value_length":
|
317
|
+
return "int"
|
318
|
+
|
319
|
+
return type_
|
320
|
+
|
321
|
+
|
322
|
+
def should_show_field(value: dict[str, Any], key: str) -> bool:
|
323
|
+
"""Determines if the field should be shown or not.
|
324
|
+
|
325
|
+
Returns:
|
326
|
+
True if the field should be shown, False otherwise.
|
327
|
+
"""
|
328
|
+
return (
|
329
|
+
(value["required"] and key != "input_variables")
|
330
|
+
or key in FORCE_SHOW_FIELDS
|
331
|
+
or any(text in key.lower() for text in ["password", "token", "api", "key"])
|
332
|
+
)
|
333
|
+
|
334
|
+
|
335
|
+
def is_password_field(key: str) -> bool:
|
336
|
+
"""Determines if the field is a password field.
|
337
|
+
|
338
|
+
Returns:
|
339
|
+
True if the field is a password field, False otherwise.
|
340
|
+
"""
|
341
|
+
return any(text in key.lower() for text in ["password", "token", "api", "key"])
|
342
|
+
|
343
|
+
|
344
|
+
def is_multiline_field(key: str) -> bool:
|
345
|
+
"""Determines if the field is a multiline field.
|
346
|
+
|
347
|
+
Returns:
|
348
|
+
True if the field is a multiline field, False otherwise.
|
349
|
+
"""
|
350
|
+
return key in {
|
351
|
+
"suffix",
|
352
|
+
"prefix",
|
353
|
+
"template",
|
354
|
+
"examples",
|
355
|
+
"code",
|
356
|
+
"headers",
|
357
|
+
"format_instructions",
|
358
|
+
}
|
359
|
+
|
360
|
+
|
361
|
+
def set_dict_file_attributes(value: dict[str, Any]) -> None:
|
362
|
+
"""Sets the file attributes for the 'dict_' key."""
|
363
|
+
value["type"] = "file"
|
364
|
+
value["fileTypes"] = [".json", ".yaml", ".yml"]
|
365
|
+
|
366
|
+
|
367
|
+
def replace_default_value_with_actual(value: dict[str, Any]) -> None:
|
368
|
+
"""Replaces the default value with the actual value."""
|
369
|
+
if "default" in value:
|
370
|
+
value["value"] = value["default"]
|
371
|
+
value.pop("default")
|
372
|
+
|
373
|
+
|
374
|
+
def set_headers_value(value: dict[str, Any]) -> None:
|
375
|
+
"""Sets the value for the 'headers' key."""
|
376
|
+
value["value"] = """{"Authorization": "Bearer <token>"}"""
|
377
|
+
|
378
|
+
|
379
|
+
def add_options_to_field(value: dict[str, Any], class_name: str | None, key: str) -> None:
|
380
|
+
"""Adds options to the field based on the class name and key."""
|
381
|
+
options_map = {
|
382
|
+
"OpenAI": constants.OPENAI_MODELS,
|
383
|
+
"ChatOpenAI": constants.CHAT_OPENAI_MODELS,
|
384
|
+
"ReasoningOpenAI": constants.REASONING_OPENAI_MODELS,
|
385
|
+
"Anthropic": constants.ANTHROPIC_MODELS,
|
386
|
+
"ChatAnthropic": constants.ANTHROPIC_MODELS,
|
387
|
+
}
|
388
|
+
|
389
|
+
if class_name in options_map and key == "model_name":
|
390
|
+
value["options"] = options_map[class_name]
|
391
|
+
value["list"] = True
|
392
|
+
value["value"] = options_map[class_name][0]
|
393
|
+
|
394
|
+
|
395
|
+
def build_loader_repr_from_data(data: list[Data]) -> str:
|
396
|
+
"""Builds a string representation of the loader based on the given data.
|
397
|
+
|
398
|
+
Args:
|
399
|
+
data (List[Data]): A list of data.
|
400
|
+
|
401
|
+
Returns:
|
402
|
+
str: A string representation of the loader.
|
403
|
+
|
404
|
+
"""
|
405
|
+
if data:
|
406
|
+
avg_length = sum(len(doc.text) for doc in data) / len(data)
|
407
|
+
return f"""{len(data)} data
|
408
|
+
\nAvg. Data Length (characters): {int(avg_length)}
|
409
|
+
Data: {data[:3]}..."""
|
410
|
+
return "0 data"
|
411
|
+
|
412
|
+
|
413
|
+
async def update_settings(
|
414
|
+
*,
|
415
|
+
config: str | None = None,
|
416
|
+
cache: str | None = None,
|
417
|
+
dev: bool = False,
|
418
|
+
remove_api_keys: bool = False,
|
419
|
+
components_path: Path | None = None,
|
420
|
+
store: bool = True,
|
421
|
+
auto_saving: bool = True,
|
422
|
+
auto_saving_interval: int = 1000,
|
423
|
+
health_check_max_retries: int = 5,
|
424
|
+
max_file_size_upload: int = 100,
|
425
|
+
webhook_polling_interval: int = 5000,
|
426
|
+
) -> None:
|
427
|
+
"""Update the settings from a config file."""
|
428
|
+
# Check for database_url in the environment variables
|
429
|
+
|
430
|
+
settings_service = get_settings_service()
|
431
|
+
if not settings_service:
|
432
|
+
msg = "Settings service not found"
|
433
|
+
raise RuntimeError(msg)
|
434
|
+
|
435
|
+
if config:
|
436
|
+
await logger.adebug(f"Loading settings from {config}")
|
437
|
+
await settings_service.settings.update_from_yaml(config, dev=dev)
|
438
|
+
if remove_api_keys:
|
439
|
+
await logger.adebug(f"Setting remove_api_keys to {remove_api_keys}")
|
440
|
+
settings_service.settings.update_settings(remove_api_keys=remove_api_keys)
|
441
|
+
if cache:
|
442
|
+
await logger.adebug(f"Setting cache to {cache}")
|
443
|
+
settings_service.settings.update_settings(cache=cache)
|
444
|
+
if components_path:
|
445
|
+
await logger.adebug(f"Adding component path {components_path}")
|
446
|
+
settings_service.settings.update_settings(components_path=components_path)
|
447
|
+
if not store:
|
448
|
+
logger.debug("Setting store to False")
|
449
|
+
settings_service.settings.update_settings(store=False)
|
450
|
+
if not auto_saving:
|
451
|
+
logger.debug("Setting auto_saving to False")
|
452
|
+
settings_service.settings.update_settings(auto_saving=False)
|
453
|
+
if auto_saving_interval is not None:
|
454
|
+
logger.debug(f"Setting auto_saving_interval to {auto_saving_interval}")
|
455
|
+
settings_service.settings.update_settings(auto_saving_interval=auto_saving_interval)
|
456
|
+
if health_check_max_retries is not None:
|
457
|
+
logger.debug(f"Setting health_check_max_retries to {health_check_max_retries}")
|
458
|
+
settings_service.settings.update_settings(health_check_max_retries=health_check_max_retries)
|
459
|
+
if max_file_size_upload is not None:
|
460
|
+
logger.debug(f"Setting max_file_size_upload to {max_file_size_upload}")
|
461
|
+
settings_service.settings.update_settings(max_file_size_upload=max_file_size_upload)
|
462
|
+
if webhook_polling_interval is not None:
|
463
|
+
logger.debug(f"Setting webhook_polling_interval to {webhook_polling_interval}")
|
464
|
+
settings_service.settings.update_settings(webhook_polling_interval=webhook_polling_interval)
|
465
|
+
|
466
|
+
|
467
|
+
def is_class_method(func, cls):
|
468
|
+
"""Check if a function is a class method."""
|
469
|
+
return inspect.ismethod(func) and func.__self__ is cls.__class__
|
470
|
+
|
471
|
+
|
472
|
+
def escape_json_dump(edge_dict):
|
473
|
+
return json.dumps(edge_dict).replace('"', "œ")
|
474
|
+
|
475
|
+
|
476
|
+
def find_closest_match(string: str, list_of_strings: list[str]) -> str | None:
|
477
|
+
"""Find the closest match in a list of strings."""
|
478
|
+
closest_match = difflib.get_close_matches(string, list_of_strings, n=1, cutoff=0.2)
|
479
|
+
if closest_match:
|
480
|
+
return closest_match[0]
|
481
|
+
return None
|
@@ -0,0 +1,56 @@
|
|
1
|
+
from lfx.serialization import constants
|
2
|
+
|
3
|
+
|
4
|
+
def truncate_long_strings(data, max_length=None):
|
5
|
+
"""Recursively traverse the dictionary or list and truncate strings longer than max_length.
|
6
|
+
|
7
|
+
Returns:
|
8
|
+
The data with strings truncated if they exceed the max length.
|
9
|
+
"""
|
10
|
+
if max_length is None:
|
11
|
+
max_length = constants.MAX_TEXT_LENGTH
|
12
|
+
|
13
|
+
if max_length < 0:
|
14
|
+
return data
|
15
|
+
|
16
|
+
if not isinstance(data, dict | list):
|
17
|
+
if isinstance(data, str) and len(data) > max_length:
|
18
|
+
return data[:max_length] + "..."
|
19
|
+
return data
|
20
|
+
|
21
|
+
if isinstance(data, dict):
|
22
|
+
for key, value in data.items():
|
23
|
+
if isinstance(value, str) and len(value) > max_length:
|
24
|
+
data[key] = value[:max_length] + "..."
|
25
|
+
elif isinstance(value, (dict | list)):
|
26
|
+
truncate_long_strings(value, max_length)
|
27
|
+
elif isinstance(data, list):
|
28
|
+
for index, item in enumerate(data):
|
29
|
+
if isinstance(item, str) and len(item) > max_length:
|
30
|
+
data[index] = item[:max_length] + "..."
|
31
|
+
elif isinstance(item, (dict | list)):
|
32
|
+
truncate_long_strings(item, max_length)
|
33
|
+
|
34
|
+
return data
|
35
|
+
|
36
|
+
|
37
|
+
def is_valid_database_url(url: str) -> bool:
|
38
|
+
"""Validate database connection URLs compatible with SQLAlchemy.
|
39
|
+
|
40
|
+
Args:
|
41
|
+
url (str): Database connection URL to validate
|
42
|
+
|
43
|
+
Returns:
|
44
|
+
bool: True if URL is valid, False otherwise
|
45
|
+
"""
|
46
|
+
try:
|
47
|
+
from sqlalchemy.engine import make_url
|
48
|
+
|
49
|
+
parsed_url = make_url(url)
|
50
|
+
parsed_url.get_dialect()
|
51
|
+
parsed_url.get_driver_name()
|
52
|
+
|
53
|
+
except Exception: # noqa: BLE001
|
54
|
+
return False
|
55
|
+
|
56
|
+
return True
|
lfx/utils/version.py
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
"""Version utilities for lfx package."""
|
2
|
+
|
3
|
+
|
4
|
+
def get_version_info():
|
5
|
+
"""Get version information for compatibility.
|
6
|
+
|
7
|
+
This is a stub implementation for lfx package.
|
8
|
+
"""
|
9
|
+
return {"version": "0.1.0", "package": "lfx"}
|
10
|
+
|
11
|
+
|
12
|
+
def is_pre_release(version: str) -> bool:
|
13
|
+
"""Check if a version is a pre-release.
|
14
|
+
|
15
|
+
Args:
|
16
|
+
version: Version string to check
|
17
|
+
|
18
|
+
Returns:
|
19
|
+
bool: True if version is a pre-release
|
20
|
+
"""
|
21
|
+
# Check for common pre-release indicators
|
22
|
+
pre_release_indicators = ["alpha", "beta", "rc", "dev", "a", "b"]
|
23
|
+
version_lower = version.lower()
|
24
|
+
return any(indicator in version_lower for indicator in pre_release_indicators)
|