lfx-nightly 0.1.11.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +268 -0
- lfx/base/agents/callback.py +130 -0
- lfx/base/agents/context.py +109 -0
- lfx/base/agents/crewai/__init__.py +0 -0
- lfx/base/agents/crewai/crew.py +231 -0
- lfx/base/agents/crewai/tasks.py +12 -0
- lfx/base/agents/default_prompts.py +23 -0
- lfx/base/agents/errors.py +15 -0
- lfx/base/agents/events.py +346 -0
- lfx/base/agents/utils.py +205 -0
- lfx/base/astra_assistants/__init__.py +0 -0
- lfx/base/astra_assistants/util.py +171 -0
- lfx/base/chains/__init__.py +0 -0
- lfx/base/chains/model.py +19 -0
- lfx/base/composio/__init__.py +0 -0
- lfx/base/composio/composio_base.py +1291 -0
- lfx/base/compressors/__init__.py +0 -0
- lfx/base/compressors/model.py +60 -0
- lfx/base/constants.py +46 -0
- lfx/base/curl/__init__.py +0 -0
- lfx/base/curl/parse.py +188 -0
- lfx/base/data/__init__.py +5 -0
- lfx/base/data/base_file.py +685 -0
- lfx/base/data/docling_utils.py +245 -0
- lfx/base/data/utils.py +198 -0
- lfx/base/document_transformers/__init__.py +0 -0
- lfx/base/document_transformers/model.py +43 -0
- lfx/base/embeddings/__init__.py +0 -0
- lfx/base/embeddings/aiml_embeddings.py +62 -0
- lfx/base/embeddings/model.py +26 -0
- lfx/base/flow_processing/__init__.py +0 -0
- lfx/base/flow_processing/utils.py +86 -0
- lfx/base/huggingface/__init__.py +0 -0
- lfx/base/huggingface/model_bridge.py +133 -0
- lfx/base/io/__init__.py +0 -0
- lfx/base/io/chat.py +20 -0
- lfx/base/io/text.py +22 -0
- lfx/base/langchain_utilities/__init__.py +0 -0
- lfx/base/langchain_utilities/model.py +35 -0
- lfx/base/langchain_utilities/spider_constants.py +1 -0
- lfx/base/langwatch/__init__.py +0 -0
- lfx/base/langwatch/utils.py +18 -0
- lfx/base/mcp/__init__.py +0 -0
- lfx/base/mcp/constants.py +2 -0
- lfx/base/mcp/util.py +1398 -0
- lfx/base/memory/__init__.py +0 -0
- lfx/base/memory/memory.py +49 -0
- lfx/base/memory/model.py +38 -0
- lfx/base/models/__init__.py +3 -0
- lfx/base/models/aiml_constants.py +51 -0
- lfx/base/models/anthropic_constants.py +47 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/groq_constants.py +134 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +307 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +8 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +49 -0
- lfx/base/models/openai_constants.py +122 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/processing/__init__.py +0 -0
- lfx/base/prompts/__init__.py +0 -0
- lfx/base/prompts/api_utils.py +224 -0
- lfx/base/prompts/utils.py +61 -0
- lfx/base/textsplitters/__init__.py +0 -0
- lfx/base/textsplitters/model.py +28 -0
- lfx/base/tools/__init__.py +0 -0
- lfx/base/tools/base.py +26 -0
- lfx/base/tools/component_tool.py +325 -0
- lfx/base/tools/constants.py +49 -0
- lfx/base/tools/flow_tool.py +132 -0
- lfx/base/tools/run_flow.py +224 -0
- lfx/base/vectorstores/__init__.py +0 -0
- lfx/base/vectorstores/model.py +193 -0
- lfx/base/vectorstores/utils.py +22 -0
- lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
- lfx/cli/__init__.py +5 -0
- lfx/cli/commands.py +319 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +441 -0
- lfx/cli/script_loader.py +247 -0
- lfx/cli/serve_app.py +546 -0
- lfx/cli/validation.py +69 -0
- lfx/components/FAISS/__init__.py +34 -0
- lfx/components/FAISS/faiss.py +111 -0
- lfx/components/Notion/__init__.py +19 -0
- lfx/components/Notion/add_content_to_page.py +269 -0
- lfx/components/Notion/create_page.py +94 -0
- lfx/components/Notion/list_database_properties.py +68 -0
- lfx/components/Notion/list_pages.py +122 -0
- lfx/components/Notion/list_users.py +77 -0
- lfx/components/Notion/page_content_viewer.py +93 -0
- lfx/components/Notion/search.py +111 -0
- lfx/components/Notion/update_page_property.py +114 -0
- lfx/components/__init__.py +411 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/agents/__init__.py +34 -0
- lfx/components/agents/agent.py +558 -0
- lfx/components/agents/mcp_component.py +501 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +112 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +124 -0
- lfx/components/amazon/s3_bucket_uploader.py +211 -0
- lfx/components/anthropic/__init__.py +34 -0
- lfx/components/anthropic/anthropic.py +187 -0
- lfx/components/apify/__init__.py +5 -0
- lfx/components/apify/apify_actor.py +325 -0
- lfx/components/arxiv/__init__.py +3 -0
- lfx/components/arxiv/arxiv.py +163 -0
- lfx/components/assemblyai/__init__.py +46 -0
- lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- lfx/components/assemblyai/assemblyai_lemur.py +183 -0
- lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
- lfx/components/azure/__init__.py +37 -0
- lfx/components/azure/azure_openai.py +95 -0
- lfx/components/azure/azure_openai_embeddings.py +83 -0
- lfx/components/baidu/__init__.py +32 -0
- lfx/components/baidu/baidu_qianfan_chat.py +113 -0
- lfx/components/bing/__init__.py +3 -0
- lfx/components/bing/bing_search_api.py +61 -0
- lfx/components/cassandra/__init__.py +40 -0
- lfx/components/cassandra/cassandra.py +264 -0
- lfx/components/cassandra/cassandra_chat.py +92 -0
- lfx/components/cassandra/cassandra_graph.py +238 -0
- lfx/components/chains/__init__.py +3 -0
- lfx/components/chroma/__init__.py +34 -0
- lfx/components/chroma/chroma.py +167 -0
- lfx/components/cleanlab/__init__.py +40 -0
- lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
- lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- lfx/components/cleanlab/cleanlab_remediator.py +131 -0
- lfx/components/clickhouse/__init__.py +34 -0
- lfx/components/clickhouse/clickhouse.py +135 -0
- lfx/components/cloudflare/__init__.py +32 -0
- lfx/components/cloudflare/cloudflare.py +81 -0
- lfx/components/cohere/__init__.py +40 -0
- lfx/components/cohere/cohere_embeddings.py +81 -0
- lfx/components/cohere/cohere_models.py +46 -0
- lfx/components/cohere/cohere_rerank.py +51 -0
- lfx/components/composio/__init__.py +74 -0
- lfx/components/composio/composio_api.py +268 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/slack_composio.py +582 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/youtube_composio.py +11 -0
- lfx/components/confluence/__init__.py +3 -0
- lfx/components/confluence/confluence.py +84 -0
- lfx/components/couchbase/__init__.py +34 -0
- lfx/components/couchbase/couchbase.py +102 -0
- lfx/components/crewai/__init__.py +49 -0
- lfx/components/crewai/crewai.py +107 -0
- lfx/components/crewai/hierarchical_crew.py +46 -0
- lfx/components/crewai/hierarchical_task.py +44 -0
- lfx/components/crewai/sequential_crew.py +52 -0
- lfx/components/crewai/sequential_task.py +73 -0
- lfx/components/crewai/sequential_task_agent.py +143 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +64 -0
- lfx/components/data/api_request.py +544 -0
- lfx/components/data/csv_to_data.py +95 -0
- lfx/components/data/directory.py +113 -0
- lfx/components/data/file.py +577 -0
- lfx/components/data/json_to_data.py +98 -0
- lfx/components/data/news_search.py +164 -0
- lfx/components/data/rss.py +69 -0
- lfx/components/data/sql_executor.py +101 -0
- lfx/components/data/url.py +311 -0
- lfx/components/data/web_search.py +112 -0
- lfx/components/data/webhook.py +56 -0
- lfx/components/datastax/__init__.py +70 -0
- lfx/components/datastax/astra_assistant_manager.py +306 -0
- lfx/components/datastax/astra_db.py +75 -0
- lfx/components/datastax/astra_vectorize.py +124 -0
- lfx/components/datastax/astradb.py +1285 -0
- lfx/components/datastax/astradb_cql.py +314 -0
- lfx/components/datastax/astradb_graph.py +330 -0
- lfx/components/datastax/astradb_tool.py +414 -0
- lfx/components/datastax/astradb_vectorstore.py +1285 -0
- lfx/components/datastax/cassandra.py +92 -0
- lfx/components/datastax/create_assistant.py +58 -0
- lfx/components/datastax/create_thread.py +32 -0
- lfx/components/datastax/dotenv.py +35 -0
- lfx/components/datastax/get_assistant.py +37 -0
- lfx/components/datastax/getenvvar.py +30 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +314 -0
- lfx/components/datastax/list_assistants.py +25 -0
- lfx/components/datastax/run.py +89 -0
- lfx/components/deactivated/__init__.py +15 -0
- lfx/components/deactivated/amazon_kendra.py +66 -0
- lfx/components/deactivated/chat_litellm_model.py +158 -0
- lfx/components/deactivated/code_block_extractor.py +26 -0
- lfx/components/deactivated/documents_to_data.py +22 -0
- lfx/components/deactivated/embed.py +16 -0
- lfx/components/deactivated/extract_key_from_data.py +46 -0
- lfx/components/deactivated/json_document_builder.py +57 -0
- lfx/components/deactivated/list_flows.py +20 -0
- lfx/components/deactivated/mcp_sse.py +61 -0
- lfx/components/deactivated/mcp_stdio.py +62 -0
- lfx/components/deactivated/merge_data.py +93 -0
- lfx/components/deactivated/message.py +37 -0
- lfx/components/deactivated/metal.py +54 -0
- lfx/components/deactivated/multi_query.py +59 -0
- lfx/components/deactivated/retriever.py +43 -0
- lfx/components/deactivated/selective_passthrough.py +77 -0
- lfx/components/deactivated/should_run_next.py +40 -0
- lfx/components/deactivated/split_text.py +63 -0
- lfx/components/deactivated/store_message.py +24 -0
- lfx/components/deactivated/sub_flow.py +124 -0
- lfx/components/deactivated/vectara_self_query.py +76 -0
- lfx/components/deactivated/vector_store.py +24 -0
- lfx/components/deepseek/__init__.py +34 -0
- lfx/components/deepseek/deepseek.py +136 -0
- lfx/components/docling/__init__.py +43 -0
- lfx/components/docling/chunk_docling_document.py +186 -0
- lfx/components/docling/docling_inline.py +231 -0
- lfx/components/docling/docling_remote.py +193 -0
- lfx/components/docling/export_docling_document.py +117 -0
- lfx/components/documentloaders/__init__.py +3 -0
- lfx/components/duckduckgo/__init__.py +3 -0
- lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- lfx/components/elastic/__init__.py +37 -0
- lfx/components/elastic/elasticsearch.py +267 -0
- lfx/components/elastic/opensearch.py +243 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +76 -0
- lfx/components/embeddings/text_embedder.py +64 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/firecrawl/__init__.py +43 -0
- lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
- lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
- lfx/components/firecrawl/firecrawl_map_api.py +89 -0
- lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
- lfx/components/git/__init__.py +4 -0
- lfx/components/git/git.py +262 -0
- lfx/components/git/gitextractor.py +196 -0
- lfx/components/glean/__init__.py +3 -0
- lfx/components/glean/glean_search_api.py +173 -0
- lfx/components/google/__init__.py +17 -0
- lfx/components/google/gmail.py +192 -0
- lfx/components/google/google_bq_sql_executor.py +157 -0
- lfx/components/google/google_drive.py +92 -0
- lfx/components/google/google_drive_search.py +152 -0
- lfx/components/google/google_generative_ai.py +147 -0
- lfx/components/google/google_generative_ai_embeddings.py +141 -0
- lfx/components/google/google_oauth_token.py +89 -0
- lfx/components/google/google_search_api_core.py +68 -0
- lfx/components/google/google_serper_api_core.py +74 -0
- lfx/components/groq/__init__.py +34 -0
- lfx/components/groq/groq.py +136 -0
- lfx/components/helpers/__init__.py +52 -0
- lfx/components/helpers/calculator_core.py +89 -0
- lfx/components/helpers/create_list.py +40 -0
- lfx/components/helpers/current_date.py +42 -0
- lfx/components/helpers/id_generator.py +42 -0
- lfx/components/helpers/memory.py +251 -0
- lfx/components/helpers/output_parser.py +45 -0
- lfx/components/helpers/store_message.py +90 -0
- lfx/components/homeassistant/__init__.py +7 -0
- lfx/components/homeassistant/home_assistant_control.py +152 -0
- lfx/components/homeassistant/list_home_assistant_states.py +137 -0
- lfx/components/huggingface/__init__.py +37 -0
- lfx/components/huggingface/huggingface.py +197 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +203 -0
- lfx/components/ibm/watsonx_embeddings.py +135 -0
- lfx/components/icosacomputing/__init__.py +5 -0
- lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
- lfx/components/input_output/__init__.py +38 -0
- lfx/components/input_output/chat.py +120 -0
- lfx/components/input_output/chat_output.py +200 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/jigsawstack/__init__.py +23 -0
- lfx/components/jigsawstack/ai_scrape.py +126 -0
- lfx/components/jigsawstack/ai_web_search.py +136 -0
- lfx/components/jigsawstack/file_read.py +115 -0
- lfx/components/jigsawstack/file_upload.py +94 -0
- lfx/components/jigsawstack/image_generation.py +205 -0
- lfx/components/jigsawstack/nsfw.py +60 -0
- lfx/components/jigsawstack/object_detection.py +124 -0
- lfx/components/jigsawstack/sentiment.py +112 -0
- lfx/components/jigsawstack/text_to_sql.py +90 -0
- lfx/components/jigsawstack/text_translate.py +77 -0
- lfx/components/jigsawstack/vocr.py +107 -0
- lfx/components/langchain_utilities/__init__.py +109 -0
- lfx/components/langchain_utilities/character.py +53 -0
- lfx/components/langchain_utilities/conversation.py +59 -0
- lfx/components/langchain_utilities/csv_agent.py +107 -0
- lfx/components/langchain_utilities/fake_embeddings.py +26 -0
- lfx/components/langchain_utilities/html_link_extractor.py +35 -0
- lfx/components/langchain_utilities/json_agent.py +45 -0
- lfx/components/langchain_utilities/langchain_hub.py +126 -0
- lfx/components/langchain_utilities/language_recursive.py +49 -0
- lfx/components/langchain_utilities/language_semantic.py +138 -0
- lfx/components/langchain_utilities/llm_checker.py +39 -0
- lfx/components/langchain_utilities/llm_math.py +42 -0
- lfx/components/langchain_utilities/natural_language.py +61 -0
- lfx/components/langchain_utilities/openai_tools.py +53 -0
- lfx/components/langchain_utilities/openapi.py +48 -0
- lfx/components/langchain_utilities/recursive_character.py +60 -0
- lfx/components/langchain_utilities/retrieval_qa.py +83 -0
- lfx/components/langchain_utilities/runnable_executor.py +137 -0
- lfx/components/langchain_utilities/self_query.py +80 -0
- lfx/components/langchain_utilities/spider.py +142 -0
- lfx/components/langchain_utilities/sql.py +40 -0
- lfx/components/langchain_utilities/sql_database.py +35 -0
- lfx/components/langchain_utilities/sql_generator.py +78 -0
- lfx/components/langchain_utilities/tool_calling.py +59 -0
- lfx/components/langchain_utilities/vector_store_info.py +49 -0
- lfx/components/langchain_utilities/vector_store_router.py +33 -0
- lfx/components/langchain_utilities/xml_agent.py +71 -0
- lfx/components/langwatch/__init__.py +3 -0
- lfx/components/langwatch/langwatch.py +278 -0
- lfx/components/link_extractors/__init__.py +3 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +129 -0
- lfx/components/logic/__init__.py +52 -0
- lfx/components/logic/conditional_router.py +171 -0
- lfx/components/logic/data_conditional_router.py +125 -0
- lfx/components/logic/flow_tool.py +110 -0
- lfx/components/logic/listen.py +29 -0
- lfx/components/logic/loop.py +125 -0
- lfx/components/logic/notify.py +88 -0
- lfx/components/logic/pass_message.py +35 -0
- lfx/components/logic/run_flow.py +71 -0
- lfx/components/logic/sub_flow.py +114 -0
- lfx/components/maritalk/__init__.py +32 -0
- lfx/components/maritalk/maritalk.py +52 -0
- lfx/components/mem0/__init__.py +3 -0
- lfx/components/mem0/mem0_chat_memory.py +136 -0
- lfx/components/milvus/__init__.py +34 -0
- lfx/components/milvus/milvus.py +115 -0
- lfx/components/mistral/__init__.py +37 -0
- lfx/components/mistral/mistral.py +114 -0
- lfx/components/mistral/mistral_embeddings.py +58 -0
- lfx/components/models/__init__.py +34 -0
- lfx/components/models/embedding_model.py +114 -0
- lfx/components/models/language_model.py +144 -0
- lfx/components/mongodb/__init__.py +34 -0
- lfx/components/mongodb/mongodb_atlas.py +213 -0
- lfx/components/needle/__init__.py +3 -0
- lfx/components/needle/needle.py +104 -0
- lfx/components/notdiamond/__init__.py +34 -0
- lfx/components/notdiamond/notdiamond.py +228 -0
- lfx/components/novita/__init__.py +32 -0
- lfx/components/novita/novita.py +130 -0
- lfx/components/nvidia/__init__.py +57 -0
- lfx/components/nvidia/nvidia.py +157 -0
- lfx/components/nvidia/nvidia_embedding.py +77 -0
- lfx/components/nvidia/nvidia_ingest.py +317 -0
- lfx/components/nvidia/nvidia_rerank.py +63 -0
- lfx/components/nvidia/system_assist.py +65 -0
- lfx/components/olivya/__init__.py +3 -0
- lfx/components/olivya/olivya.py +116 -0
- lfx/components/ollama/__init__.py +37 -0
- lfx/components/ollama/ollama.py +330 -0
- lfx/components/ollama/ollama_embeddings.py +106 -0
- lfx/components/openai/__init__.py +37 -0
- lfx/components/openai/openai.py +100 -0
- lfx/components/openai/openai_chat_model.py +176 -0
- lfx/components/openrouter/__init__.py +32 -0
- lfx/components/openrouter/openrouter.py +202 -0
- lfx/components/output_parsers/__init__.py +3 -0
- lfx/components/perplexity/__init__.py +34 -0
- lfx/components/perplexity/perplexity.py +75 -0
- lfx/components/pgvector/__init__.py +34 -0
- lfx/components/pgvector/pgvector.py +72 -0
- lfx/components/pinecone/__init__.py +34 -0
- lfx/components/pinecone/pinecone.py +134 -0
- lfx/components/processing/__init__.py +117 -0
- lfx/components/processing/alter_metadata.py +108 -0
- lfx/components/processing/batch_run.py +205 -0
- lfx/components/processing/combine_text.py +39 -0
- lfx/components/processing/converter.py +159 -0
- lfx/components/processing/create_data.py +110 -0
- lfx/components/processing/data_operations.py +438 -0
- lfx/components/processing/data_to_dataframe.py +70 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/extract_key.py +53 -0
- lfx/components/processing/filter_data.py +42 -0
- lfx/components/processing/filter_data_values.py +88 -0
- lfx/components/processing/json_cleaner.py +103 -0
- lfx/components/processing/lambda_filter.py +154 -0
- lfx/components/processing/llm_router.py +499 -0
- lfx/components/processing/merge_data.py +90 -0
- lfx/components/processing/message_to_data.py +36 -0
- lfx/components/processing/parse_data.py +70 -0
- lfx/components/processing/parse_dataframe.py +68 -0
- lfx/components/processing/parse_json_data.py +90 -0
- lfx/components/processing/parser.py +143 -0
- lfx/components/processing/prompt.py +67 -0
- lfx/components/processing/python_repl_core.py +98 -0
- lfx/components/processing/regex.py +82 -0
- lfx/components/processing/save_file.py +225 -0
- lfx/components/processing/select_data.py +48 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/structured_output.py +202 -0
- lfx/components/processing/update_data.py +160 -0
- lfx/components/prototypes/__init__.py +34 -0
- lfx/components/prototypes/python_function.py +73 -0
- lfx/components/qdrant/__init__.py +34 -0
- lfx/components/qdrant/qdrant.py +109 -0
- lfx/components/redis/__init__.py +37 -0
- lfx/components/redis/redis.py +89 -0
- lfx/components/redis/redis_chat.py +43 -0
- lfx/components/sambanova/__init__.py +32 -0
- lfx/components/sambanova/sambanova.py +84 -0
- lfx/components/scrapegraph/__init__.py +40 -0
- lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- lfx/components/searchapi/__init__.py +34 -0
- lfx/components/searchapi/search.py +79 -0
- lfx/components/serpapi/__init__.py +3 -0
- lfx/components/serpapi/serp.py +115 -0
- lfx/components/supabase/__init__.py +34 -0
- lfx/components/supabase/supabase.py +76 -0
- lfx/components/tavily/__init__.py +4 -0
- lfx/components/tavily/tavily_extract.py +117 -0
- lfx/components/tavily/tavily_search.py +212 -0
- lfx/components/textsplitters/__init__.py +3 -0
- lfx/components/toolkits/__init__.py +3 -0
- lfx/components/tools/__init__.py +72 -0
- lfx/components/tools/calculator.py +108 -0
- lfx/components/tools/google_search_api.py +45 -0
- lfx/components/tools/google_serper_api.py +115 -0
- lfx/components/tools/python_code_structured_tool.py +327 -0
- lfx/components/tools/python_repl.py +97 -0
- lfx/components/tools/search_api.py +87 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +119 -0
- lfx/components/tools/tavily_search_tool.py +344 -0
- lfx/components/tools/wikidata_api.py +102 -0
- lfx/components/tools/wikipedia_api.py +49 -0
- lfx/components/tools/yahoo_finance.py +129 -0
- lfx/components/twelvelabs/__init__.py +52 -0
- lfx/components/twelvelabs/convert_astra_results.py +84 -0
- lfx/components/twelvelabs/pegasus_index.py +311 -0
- lfx/components/twelvelabs/split_video.py +291 -0
- lfx/components/twelvelabs/text_embeddings.py +57 -0
- lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- lfx/components/twelvelabs/video_embeddings.py +100 -0
- lfx/components/twelvelabs/video_file.py +179 -0
- lfx/components/unstructured/__init__.py +3 -0
- lfx/components/unstructured/unstructured.py +121 -0
- lfx/components/upstash/__init__.py +34 -0
- lfx/components/upstash/upstash.py +124 -0
- lfx/components/vectara/__init__.py +37 -0
- lfx/components/vectara/vectara.py +97 -0
- lfx/components/vectara/vectara_rag.py +164 -0
- lfx/components/vectorstores/__init__.py +40 -0
- lfx/components/vectorstores/astradb.py +1285 -0
- lfx/components/vectorstores/astradb_graph.py +319 -0
- lfx/components/vectorstores/cassandra.py +264 -0
- lfx/components/vectorstores/cassandra_graph.py +238 -0
- lfx/components/vectorstores/chroma.py +167 -0
- lfx/components/vectorstores/clickhouse.py +135 -0
- lfx/components/vectorstores/couchbase.py +102 -0
- lfx/components/vectorstores/elasticsearch.py +267 -0
- lfx/components/vectorstores/faiss.py +111 -0
- lfx/components/vectorstores/graph_rag.py +141 -0
- lfx/components/vectorstores/hcd.py +314 -0
- lfx/components/vectorstores/local_db.py +261 -0
- lfx/components/vectorstores/milvus.py +115 -0
- lfx/components/vectorstores/mongodb_atlas.py +213 -0
- lfx/components/vectorstores/opensearch.py +243 -0
- lfx/components/vectorstores/pgvector.py +72 -0
- lfx/components/vectorstores/pinecone.py +134 -0
- lfx/components/vectorstores/qdrant.py +109 -0
- lfx/components/vectorstores/supabase.py +76 -0
- lfx/components/vectorstores/upstash.py +124 -0
- lfx/components/vectorstores/vectara.py +97 -0
- lfx/components/vectorstores/vectara_rag.py +164 -0
- lfx/components/vectorstores/weaviate.py +89 -0
- lfx/components/vertexai/__init__.py +37 -0
- lfx/components/vertexai/vertexai.py +71 -0
- lfx/components/vertexai/vertexai_embeddings.py +67 -0
- lfx/components/weaviate/__init__.py +34 -0
- lfx/components/weaviate/weaviate.py +89 -0
- lfx/components/wikipedia/__init__.py +4 -0
- lfx/components/wikipedia/wikidata.py +86 -0
- lfx/components/wikipedia/wikipedia.py +53 -0
- lfx/components/wolframalpha/__init__.py +3 -0
- lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
- lfx/components/xai/__init__.py +32 -0
- lfx/components/xai/xai.py +167 -0
- lfx/components/yahoosearch/__init__.py +3 -0
- lfx/components/yahoosearch/yahoo.py +137 -0
- lfx/components/youtube/__init__.py +52 -0
- lfx/components/youtube/channel.py +227 -0
- lfx/components/youtube/comments.py +231 -0
- lfx/components/youtube/playlist.py +33 -0
- lfx/components/youtube/search.py +120 -0
- lfx/components/youtube/trending.py +285 -0
- lfx/components/youtube/video_details.py +263 -0
- lfx/components/youtube/youtube_transcripts.py +118 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +44 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +86 -0
- lfx/custom/code_parser/__init__.py +3 -0
- lfx/custom/code_parser/code_parser.py +361 -0
- lfx/custom/custom_component/__init__.py +0 -0
- lfx/custom/custom_component/base_component.py +128 -0
- lfx/custom/custom_component/component.py +1808 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +588 -0
- lfx/custom/dependency_analyzer.py +165 -0
- lfx/custom/directory_reader/__init__.py +3 -0
- lfx/custom/directory_reader/directory_reader.py +359 -0
- lfx/custom/directory_reader/utils.py +171 -0
- lfx/custom/eval.py +12 -0
- lfx/custom/schema.py +32 -0
- lfx/custom/tree_visitor.py +21 -0
- lfx/custom/utils.py +877 -0
- lfx/custom/validate.py +488 -0
- lfx/events/__init__.py +1 -0
- lfx/events/event_manager.py +110 -0
- lfx/exceptions/__init__.py +0 -0
- lfx/exceptions/component.py +15 -0
- lfx/field_typing/__init__.py +91 -0
- lfx/field_typing/constants.py +215 -0
- lfx/field_typing/range_spec.py +35 -0
- lfx/graph/__init__.py +6 -0
- lfx/graph/edge/__init__.py +0 -0
- lfx/graph/edge/base.py +277 -0
- lfx/graph/edge/schema.py +119 -0
- lfx/graph/edge/utils.py +0 -0
- lfx/graph/graph/__init__.py +0 -0
- lfx/graph/graph/ascii.py +202 -0
- lfx/graph/graph/base.py +2238 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +52 -0
- lfx/graph/graph/state_model.py +66 -0
- lfx/graph/graph/utils.py +1024 -0
- lfx/graph/schema.py +75 -0
- lfx/graph/state/__init__.py +0 -0
- lfx/graph/state/model.py +237 -0
- lfx/graph/utils.py +200 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +823 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +264 -0
- lfx/graph/vertex/schema.py +26 -0
- lfx/graph/vertex/utils.py +19 -0
- lfx/graph/vertex/vertex_types.py +489 -0
- lfx/helpers/__init__.py +1 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +194 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +328 -0
- lfx/inputs/inputs.py +714 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +489 -0
- lfx/interface/importing/__init__.py +5 -0
- lfx/interface/importing/utils.py +39 -0
- lfx/interface/initialize/__init__.py +3 -0
- lfx/interface/initialize/loading.py +224 -0
- lfx/interface/listing.py +26 -0
- lfx/interface/run.py +16 -0
- lfx/interface/utils.py +111 -0
- lfx/io/__init__.py +63 -0
- lfx/io/schema.py +289 -0
- lfx/load/__init__.py +8 -0
- lfx/load/load.py +256 -0
- lfx/load/utils.py +99 -0
- lfx/log/__init__.py +5 -0
- lfx/log/logger.py +385 -0
- lfx/memory/__init__.py +90 -0
- lfx/memory/stubs.py +283 -0
- lfx/processing/__init__.py +1 -0
- lfx/processing/process.py +238 -0
- lfx/processing/utils.py +25 -0
- lfx/py.typed +0 -0
- lfx/schema/__init__.py +66 -0
- lfx/schema/artifact.py +83 -0
- lfx/schema/content_block.py +62 -0
- lfx/schema/content_types.py +91 -0
- lfx/schema/data.py +308 -0
- lfx/schema/dataframe.py +210 -0
- lfx/schema/dotdict.py +74 -0
- lfx/schema/encoders.py +13 -0
- lfx/schema/graph.py +47 -0
- lfx/schema/image.py +131 -0
- lfx/schema/json_schema.py +141 -0
- lfx/schema/log.py +61 -0
- lfx/schema/message.py +473 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +171 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +140 -0
- lfx/schema/validators.py +114 -0
- lfx/serialization/__init__.py +5 -0
- lfx/serialization/constants.py +2 -0
- lfx/serialization/serialization.py +314 -0
- lfx/services/__init__.py +23 -0
- lfx/services/base.py +28 -0
- lfx/services/cache/__init__.py +6 -0
- lfx/services/cache/base.py +183 -0
- lfx/services/cache/service.py +166 -0
- lfx/services/cache/utils.py +169 -0
- lfx/services/chat/__init__.py +1 -0
- lfx/services/chat/config.py +2 -0
- lfx/services/chat/schema.py +10 -0
- lfx/services/deps.py +129 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +172 -0
- lfx/services/schema.py +20 -0
- lfx/services/session.py +82 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +130 -0
- lfx/services/settings/base.py +539 -0
- lfx/services/settings/constants.py +31 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +12 -0
- lfx/services/settings/service.py +35 -0
- lfx/services/settings/utils.py +40 -0
- lfx/services/shared_component_cache/__init__.py +1 -0
- lfx/services/shared_component_cache/factory.py +30 -0
- lfx/services/shared_component_cache/service.py +9 -0
- lfx/services/storage/__init__.py +5 -0
- lfx/services/storage/local.py +155 -0
- lfx/services/storage/service.py +54 -0
- lfx/services/tracing/__init__.py +1 -0
- lfx/services/tracing/service.py +21 -0
- lfx/settings.py +6 -0
- lfx/template/__init__.py +6 -0
- lfx/template/field/__init__.py +0 -0
- lfx/template/field/base.py +257 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +212 -0
- lfx/template/frontend_node/constants.py +65 -0
- lfx/template/frontend_node/custom_components.py +79 -0
- lfx/template/template/__init__.py +0 -0
- lfx/template/template/base.py +100 -0
- lfx/template/utils.py +217 -0
- lfx/type_extraction/__init__.py +19 -0
- lfx/type_extraction/type_extraction.py +75 -0
- lfx/type_extraction.py +80 -0
- lfx/utils/__init__.py +1 -0
- lfx/utils/async_helpers.py +42 -0
- lfx/utils/component_utils.py +154 -0
- lfx/utils/concurrency.py +60 -0
- lfx/utils/connection_string_parser.py +11 -0
- lfx/utils/constants.py +205 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +28 -0
- lfx/utils/image.py +73 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/util.py +481 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
- lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
- lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
- lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
@@ -0,0 +1,314 @@
|
|
1
|
+
from collections.abc import AsyncIterator, Generator, Iterator
|
2
|
+
from datetime import datetime, timezone
|
3
|
+
from decimal import Decimal
|
4
|
+
from typing import Any, cast
|
5
|
+
from uuid import UUID
|
6
|
+
|
7
|
+
import numpy as np
|
8
|
+
import pandas as pd
|
9
|
+
from langchain_core.documents import Document
|
10
|
+
from pydantic import BaseModel
|
11
|
+
from pydantic.v1 import BaseModel as BaseModelV1
|
12
|
+
|
13
|
+
from lfx.log.logger import logger
|
14
|
+
from lfx.serialization.constants import MAX_ITEMS_LENGTH, MAX_TEXT_LENGTH
|
15
|
+
|
16
|
+
|
17
|
+
def get_max_text_length() -> int:
|
18
|
+
"""Return the maximum allowed text length for serialization."""
|
19
|
+
return MAX_TEXT_LENGTH
|
20
|
+
|
21
|
+
|
22
|
+
def get_max_items_length() -> int:
|
23
|
+
"""Return the maximum allowed number of items for serialization."""
|
24
|
+
return MAX_ITEMS_LENGTH
|
25
|
+
|
26
|
+
|
27
|
+
# Sentinel variable to signal a failed serialization.
|
28
|
+
# Using a helper class ensures that the sentinel is a unique object,
|
29
|
+
# while its __repr__ displays the desired message.
|
30
|
+
class _UnserializableSentinel:
|
31
|
+
def __repr__(self):
|
32
|
+
return "[Unserializable Object]"
|
33
|
+
|
34
|
+
|
35
|
+
UNSERIALIZABLE_SENTINEL = _UnserializableSentinel()
|
36
|
+
|
37
|
+
|
38
|
+
def _serialize_str(obj: str, max_length: int | None, _) -> str:
|
39
|
+
"""Truncates a string to the specified maximum length, appending an ellipsis if truncation occurs.
|
40
|
+
|
41
|
+
Parameters:
|
42
|
+
obj (str): The string to be truncated.
|
43
|
+
max_length (int | None): The maximum allowed length of the string. If None, no truncation is performed.
|
44
|
+
|
45
|
+
Returns:
|
46
|
+
str: The original or truncated string, with an ellipsis appended if truncated.
|
47
|
+
"""
|
48
|
+
if max_length is None or len(obj) <= max_length:
|
49
|
+
return obj
|
50
|
+
return obj[:max_length] + "..."
|
51
|
+
|
52
|
+
|
53
|
+
def _serialize_bytes(obj: bytes, max_length: int | None, _) -> str:
|
54
|
+
"""Decode bytes to string and truncate if max_length provided."""
|
55
|
+
if max_length is not None:
|
56
|
+
return (
|
57
|
+
obj[:max_length].decode("utf-8", errors="ignore") + "..."
|
58
|
+
if len(obj) > max_length
|
59
|
+
else obj.decode("utf-8", errors="ignore")
|
60
|
+
)
|
61
|
+
return obj.decode("utf-8", errors="ignore")
|
62
|
+
|
63
|
+
|
64
|
+
def _serialize_datetime(obj: datetime, *_) -> str:
|
65
|
+
"""Convert datetime to UTC ISO format."""
|
66
|
+
return obj.replace(tzinfo=timezone.utc).isoformat()
|
67
|
+
|
68
|
+
|
69
|
+
def _serialize_decimal(obj: Decimal, *_) -> float:
|
70
|
+
"""Convert Decimal to float."""
|
71
|
+
return float(obj)
|
72
|
+
|
73
|
+
|
74
|
+
def _serialize_uuid(obj: UUID, *_) -> str:
|
75
|
+
"""Convert UUID to string."""
|
76
|
+
return str(obj)
|
77
|
+
|
78
|
+
|
79
|
+
def _serialize_document(obj: Document, max_length: int | None, max_items: int | None) -> Any:
|
80
|
+
"""Serialize Langchain Document recursively."""
|
81
|
+
return serialize(obj.to_json(), max_length, max_items)
|
82
|
+
|
83
|
+
|
84
|
+
def _serialize_iterator(_: AsyncIterator | Generator | Iterator, *__) -> str:
|
85
|
+
"""Handle unconsumed iterators uniformly."""
|
86
|
+
return "Unconsumed Stream"
|
87
|
+
|
88
|
+
|
89
|
+
def _serialize_pydantic(obj: BaseModel, max_length: int | None, max_items: int | None) -> Any:
|
90
|
+
"""Handle modern Pydantic models."""
|
91
|
+
serialized = obj.model_dump()
|
92
|
+
return {k: serialize(v, max_length, max_items) for k, v in serialized.items()}
|
93
|
+
|
94
|
+
|
95
|
+
def _serialize_pydantic_v1(obj: BaseModelV1, max_length: int | None, max_items: int | None) -> Any:
|
96
|
+
"""Backwards-compatible handling for Pydantic v1 models."""
|
97
|
+
if hasattr(obj, "to_json"):
|
98
|
+
return serialize(obj.to_json(), max_length, max_items)
|
99
|
+
return serialize(obj.dict(), max_length, max_items)
|
100
|
+
|
101
|
+
|
102
|
+
def _serialize_dict(obj: dict, max_length: int | None, max_items: int | None) -> dict:
|
103
|
+
"""Recursively process dictionary values."""
|
104
|
+
return {k: serialize(v, max_length, max_items) for k, v in obj.items()}
|
105
|
+
|
106
|
+
|
107
|
+
def _serialize_list_tuple(obj: list | tuple, max_length: int | None, max_items: int | None) -> list:
|
108
|
+
"""Truncate long lists and process items recursively."""
|
109
|
+
if max_items is not None and len(obj) > max_items:
|
110
|
+
truncated = list(obj)[:max_items]
|
111
|
+
truncated.append(f"... [truncated {len(obj) - max_items} items]")
|
112
|
+
obj = truncated
|
113
|
+
return [serialize(item, max_length, max_items) for item in obj]
|
114
|
+
|
115
|
+
|
116
|
+
def _serialize_primitive(obj: Any, *_) -> Any:
|
117
|
+
"""Handle primitive types without conversion."""
|
118
|
+
if obj is None or isinstance(obj, int | float | bool | complex):
|
119
|
+
return obj
|
120
|
+
return UNSERIALIZABLE_SENTINEL
|
121
|
+
|
122
|
+
|
123
|
+
def _serialize_instance(obj: Any, *_) -> str:
|
124
|
+
"""Handle regular class instances by converting to string."""
|
125
|
+
return str(obj)
|
126
|
+
|
127
|
+
|
128
|
+
def _truncate_value(value: Any, max_length: int | None, max_items: int | None) -> Any:
|
129
|
+
"""Truncate value based on its type and provided limits."""
|
130
|
+
if max_length is not None and isinstance(value, str) and len(value) > max_length:
|
131
|
+
return value[:max_length]
|
132
|
+
if max_items is not None and isinstance(value, list | tuple) and len(value) > max_items:
|
133
|
+
return value[:max_items]
|
134
|
+
return value
|
135
|
+
|
136
|
+
|
137
|
+
def _serialize_dataframe(obj: pd.DataFrame, max_length: int | None, max_items: int | None) -> list[dict]:
|
138
|
+
"""Serialize pandas DataFrame to a dictionary format."""
|
139
|
+
if max_items is not None and len(obj) > max_items:
|
140
|
+
obj = obj.head(max_items)
|
141
|
+
|
142
|
+
data = obj.to_dict(orient="records")
|
143
|
+
|
144
|
+
return serialize(data, max_length, max_items)
|
145
|
+
|
146
|
+
|
147
|
+
def _serialize_series(obj: pd.Series, max_length: int | None, max_items: int | None) -> dict:
|
148
|
+
"""Serialize pandas Series to a dictionary format."""
|
149
|
+
if max_items is not None and len(obj) > max_items:
|
150
|
+
obj = obj.head(max_items)
|
151
|
+
return {index: _truncate_value(value, max_length, max_items) for index, value in obj.items()}
|
152
|
+
|
153
|
+
|
154
|
+
def _is_numpy_type(obj: Any) -> bool:
|
155
|
+
"""Check if an object is a numpy type by checking its type's module name."""
|
156
|
+
return hasattr(type(obj), "__module__") and type(obj).__module__ == np.__name__
|
157
|
+
|
158
|
+
|
159
|
+
def _serialize_numpy_type(obj: Any, max_length: int | None, max_items: int | None) -> Any:
|
160
|
+
"""Serialize numpy types."""
|
161
|
+
try:
|
162
|
+
# For single-element arrays
|
163
|
+
if obj.size == 1 and hasattr(obj, "item"):
|
164
|
+
return obj.item()
|
165
|
+
|
166
|
+
# For multi-element arrays
|
167
|
+
if np.issubdtype(obj.dtype, np.number):
|
168
|
+
return obj.tolist() # Convert to Python list
|
169
|
+
if np.issubdtype(obj.dtype, np.bool_):
|
170
|
+
return bool(obj)
|
171
|
+
if np.issubdtype(obj.dtype, np.complexfloating):
|
172
|
+
return complex(cast("complex", obj))
|
173
|
+
if np.issubdtype(obj.dtype, np.str_):
|
174
|
+
return _serialize_str(str(obj), max_length, max_items)
|
175
|
+
if np.issubdtype(obj.dtype, np.bytes_) and hasattr(obj, "tobytes"):
|
176
|
+
return _serialize_bytes(obj.tobytes(), max_length, max_items)
|
177
|
+
if np.issubdtype(obj.dtype, np.object_) and hasattr(obj, "item"):
|
178
|
+
return _serialize_instance(obj.item(), max_length, max_items)
|
179
|
+
except Exception: # noqa: BLE001
|
180
|
+
return UNSERIALIZABLE_SENTINEL
|
181
|
+
return UNSERIALIZABLE_SENTINEL
|
182
|
+
|
183
|
+
|
184
|
+
def _serialize_dispatcher(obj: Any, max_length: int | None, max_items: int | None) -> Any | _UnserializableSentinel:
|
185
|
+
"""Dispatch object to appropriate serializer."""
|
186
|
+
# Handle primitive types first
|
187
|
+
if obj is None:
|
188
|
+
return obj
|
189
|
+
primitive = _serialize_primitive(obj, max_length, max_items)
|
190
|
+
if primitive is not UNSERIALIZABLE_SENTINEL:
|
191
|
+
return primitive
|
192
|
+
|
193
|
+
match obj:
|
194
|
+
case str():
|
195
|
+
return _serialize_str(obj, max_length, max_items)
|
196
|
+
case bytes():
|
197
|
+
return _serialize_bytes(obj, max_length, max_items)
|
198
|
+
case datetime():
|
199
|
+
return _serialize_datetime(obj, max_length, max_items)
|
200
|
+
case Decimal():
|
201
|
+
return _serialize_decimal(obj, max_length, max_items)
|
202
|
+
case UUID():
|
203
|
+
return _serialize_uuid(obj, max_length, max_items)
|
204
|
+
case Document():
|
205
|
+
return _serialize_document(obj, max_length, max_items)
|
206
|
+
case AsyncIterator() | Generator() | Iterator():
|
207
|
+
return _serialize_iterator(obj, max_length, max_items)
|
208
|
+
case BaseModel():
|
209
|
+
return _serialize_pydantic(obj, max_length, max_items)
|
210
|
+
case BaseModelV1():
|
211
|
+
return _serialize_pydantic_v1(obj, max_length, max_items)
|
212
|
+
case dict():
|
213
|
+
return _serialize_dict(obj, max_length, max_items)
|
214
|
+
case pd.DataFrame():
|
215
|
+
return _serialize_dataframe(obj, max_length, max_items)
|
216
|
+
case pd.Series():
|
217
|
+
return _serialize_series(obj, max_length, max_items)
|
218
|
+
case list() | tuple():
|
219
|
+
return _serialize_list_tuple(obj, max_length, max_items)
|
220
|
+
case object() if _is_numpy_type(obj):
|
221
|
+
return _serialize_numpy_type(obj, max_length, max_items)
|
222
|
+
case object() if not isinstance(obj, type): # Match any instance that's not a class
|
223
|
+
return _serialize_instance(obj, max_length, max_items)
|
224
|
+
case object() if hasattr(obj, "_name_"): # Enum case
|
225
|
+
return f"{obj.__class__.__name__}.{obj._name_}"
|
226
|
+
case object() if hasattr(obj, "__name__") and hasattr(obj, "__bound__"): # TypeVar case
|
227
|
+
return repr(obj)
|
228
|
+
case object() if hasattr(obj, "__origin__") or hasattr(obj, "__parameters__"): # Type alias/generic case
|
229
|
+
return repr(obj)
|
230
|
+
case _:
|
231
|
+
# Handle numpy numeric types (int, float, bool, complex)
|
232
|
+
if hasattr(obj, "dtype"):
|
233
|
+
if np.issubdtype(obj.dtype, np.number) and hasattr(obj, "item"):
|
234
|
+
return obj.item()
|
235
|
+
if np.issubdtype(obj.dtype, np.bool_):
|
236
|
+
return bool(obj)
|
237
|
+
if np.issubdtype(obj.dtype, np.complexfloating):
|
238
|
+
return complex(cast("complex", obj))
|
239
|
+
if np.issubdtype(obj.dtype, np.str_):
|
240
|
+
return str(obj)
|
241
|
+
if np.issubdtype(obj.dtype, np.bytes_) and hasattr(obj, "tobytes"):
|
242
|
+
return obj.tobytes().decode("utf-8", errors="ignore")
|
243
|
+
if np.issubdtype(obj.dtype, np.object_) and hasattr(obj, "item"):
|
244
|
+
return serialize(obj.item())
|
245
|
+
return UNSERIALIZABLE_SENTINEL
|
246
|
+
|
247
|
+
|
248
|
+
def serialize(
|
249
|
+
obj: Any,
|
250
|
+
max_length: int | None = None,
|
251
|
+
max_items: int | None = None,
|
252
|
+
*,
|
253
|
+
to_str: bool = False,
|
254
|
+
) -> Any:
|
255
|
+
"""Unified serialization with optional truncation support.
|
256
|
+
|
257
|
+
Coordinates specialized serializers through a dispatcher pattern.
|
258
|
+
Maintains recursive processing for nested structures.
|
259
|
+
|
260
|
+
Args:
|
261
|
+
obj: Object to serialize
|
262
|
+
max_length: Maximum length for string values, None for no truncation
|
263
|
+
max_items: Maximum items in list-like structures, None for no truncation
|
264
|
+
to_str: If True, return a string representation of the object if serialization fails
|
265
|
+
"""
|
266
|
+
if obj is None:
|
267
|
+
return None
|
268
|
+
try:
|
269
|
+
# First try type-specific serialization
|
270
|
+
result = _serialize_dispatcher(obj, max_length, max_items)
|
271
|
+
if result is not UNSERIALIZABLE_SENTINEL: # Special check for None since it's a valid result
|
272
|
+
return result
|
273
|
+
|
274
|
+
# Handle class-based Pydantic types and other types
|
275
|
+
if isinstance(obj, type):
|
276
|
+
if issubclass(obj, BaseModel | BaseModelV1):
|
277
|
+
return repr(obj)
|
278
|
+
return str(obj) # Handle other class types
|
279
|
+
|
280
|
+
# Handle type aliases and generic types
|
281
|
+
if hasattr(obj, "__origin__") or hasattr(obj, "__parameters__"): # Type alias or generic type check
|
282
|
+
try:
|
283
|
+
return repr(obj)
|
284
|
+
except Exception: # noqa: BLE001
|
285
|
+
logger.debug(f"Error serializing object: {obj}", exc_info=True)
|
286
|
+
|
287
|
+
# Fallback to common serialization patterns
|
288
|
+
if hasattr(obj, "model_dump"):
|
289
|
+
return serialize(obj.model_dump(), max_length, max_items)
|
290
|
+
if hasattr(obj, "dict") and not isinstance(obj, type):
|
291
|
+
return serialize(obj.dict(), max_length, max_items)
|
292
|
+
|
293
|
+
# Final fallback to string conversion only if explicitly requested
|
294
|
+
if to_str:
|
295
|
+
return str(obj)
|
296
|
+
|
297
|
+
except Exception: # noqa: BLE001
|
298
|
+
return "[Unserializable Object]"
|
299
|
+
return obj
|
300
|
+
|
301
|
+
|
302
|
+
def serialize_or_str(
|
303
|
+
obj: Any,
|
304
|
+
max_length: int | None = MAX_TEXT_LENGTH,
|
305
|
+
max_items: int | None = MAX_ITEMS_LENGTH,
|
306
|
+
) -> Any:
|
307
|
+
"""Calls serialize() and if it fails, returns a string representation of the object.
|
308
|
+
|
309
|
+
Args:
|
310
|
+
obj: Object to serialize
|
311
|
+
max_length: Maximum length for string values, None for no truncation
|
312
|
+
max_items: Maximum items in list-like structures, None for no truncation
|
313
|
+
"""
|
314
|
+
return serialize(obj, max_length, max_items, to_str=True)
|
lfx/services/__init__.py
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
from .interfaces import (
|
2
|
+
CacheServiceProtocol,
|
3
|
+
ChatServiceProtocol,
|
4
|
+
DatabaseServiceProtocol,
|
5
|
+
SettingsServiceProtocol,
|
6
|
+
StorageServiceProtocol,
|
7
|
+
TracingServiceProtocol,
|
8
|
+
VariableServiceProtocol,
|
9
|
+
)
|
10
|
+
from .manager import ServiceManager
|
11
|
+
from .session import NoopSession
|
12
|
+
|
13
|
+
__all__ = [
|
14
|
+
"CacheServiceProtocol",
|
15
|
+
"ChatServiceProtocol",
|
16
|
+
"DatabaseServiceProtocol",
|
17
|
+
"NoopSession",
|
18
|
+
"ServiceManager",
|
19
|
+
"SettingsServiceProtocol",
|
20
|
+
"StorageServiceProtocol",
|
21
|
+
"TracingServiceProtocol",
|
22
|
+
"VariableServiceProtocol",
|
23
|
+
]
|
lfx/services/base.py
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
"""Base service classes for lfx package."""
|
2
|
+
|
3
|
+
from abc import ABC, abstractmethod
|
4
|
+
|
5
|
+
|
6
|
+
class Service(ABC):
|
7
|
+
"""Base service class."""
|
8
|
+
|
9
|
+
def __init__(self):
|
10
|
+
self._ready = False
|
11
|
+
|
12
|
+
@property
|
13
|
+
@abstractmethod
|
14
|
+
def name(self) -> str:
|
15
|
+
"""Service name."""
|
16
|
+
|
17
|
+
def set_ready(self) -> None:
|
18
|
+
"""Mark service as ready."""
|
19
|
+
self._ready = True
|
20
|
+
|
21
|
+
@property
|
22
|
+
def ready(self) -> bool:
|
23
|
+
"""Check if service is ready."""
|
24
|
+
return self._ready
|
25
|
+
|
26
|
+
@abstractmethod
|
27
|
+
async def teardown(self) -> None:
|
28
|
+
"""Teardown the service."""
|
@@ -0,0 +1,183 @@
|
|
1
|
+
import abc
|
2
|
+
import asyncio
|
3
|
+
import threading
|
4
|
+
from typing import Generic, TypeVar
|
5
|
+
|
6
|
+
from lfx.services.interfaces import CacheServiceProtocol
|
7
|
+
|
8
|
+
LockType = TypeVar("LockType", bound=threading.Lock)
|
9
|
+
AsyncLockType = TypeVar("AsyncLockType", bound=asyncio.Lock)
|
10
|
+
|
11
|
+
|
12
|
+
class CacheService(CacheServiceProtocol, Generic[LockType]):
|
13
|
+
"""Abstract base class for a cache."""
|
14
|
+
|
15
|
+
name = "cache_service"
|
16
|
+
|
17
|
+
@abc.abstractmethod
|
18
|
+
def get(self, key, lock: LockType | None = None):
|
19
|
+
"""Retrieve an item from the cache.
|
20
|
+
|
21
|
+
Args:
|
22
|
+
key: The key of the item to retrieve.
|
23
|
+
lock: A lock to use for the operation.
|
24
|
+
|
25
|
+
Returns:
|
26
|
+
The value associated with the key, or CACHE_MISS if the key is not found.
|
27
|
+
"""
|
28
|
+
|
29
|
+
@abc.abstractmethod
|
30
|
+
def set(self, key, value, lock: LockType | None = None):
|
31
|
+
"""Add an item to the cache.
|
32
|
+
|
33
|
+
Args:
|
34
|
+
key: The key of the item.
|
35
|
+
value: The value to cache.
|
36
|
+
lock: A lock to use for the operation.
|
37
|
+
"""
|
38
|
+
|
39
|
+
@abc.abstractmethod
|
40
|
+
def upsert(self, key, value, lock: LockType | None = None):
|
41
|
+
"""Add an item to the cache if it doesn't exist, or update it if it does.
|
42
|
+
|
43
|
+
Args:
|
44
|
+
key: The key of the item.
|
45
|
+
value: The value to cache.
|
46
|
+
lock: A lock to use for the operation.
|
47
|
+
"""
|
48
|
+
|
49
|
+
@abc.abstractmethod
|
50
|
+
def delete(self, key, lock: LockType | None = None):
|
51
|
+
"""Remove an item from the cache.
|
52
|
+
|
53
|
+
Args:
|
54
|
+
key: The key of the item to remove.
|
55
|
+
lock: A lock to use for the operation.
|
56
|
+
"""
|
57
|
+
|
58
|
+
@abc.abstractmethod
|
59
|
+
def clear(self, lock: LockType | None = None):
|
60
|
+
"""Clear all items from the cache."""
|
61
|
+
|
62
|
+
@abc.abstractmethod
|
63
|
+
def contains(self, key) -> bool:
|
64
|
+
"""Check if the key is in the cache.
|
65
|
+
|
66
|
+
Args:
|
67
|
+
key: The key of the item to check.
|
68
|
+
|
69
|
+
Returns:
|
70
|
+
True if the key is in the cache, False otherwise.
|
71
|
+
"""
|
72
|
+
|
73
|
+
@abc.abstractmethod
|
74
|
+
def __contains__(self, key) -> bool:
|
75
|
+
"""Check if the key is in the cache.
|
76
|
+
|
77
|
+
Args:
|
78
|
+
key: The key of the item to check.
|
79
|
+
|
80
|
+
Returns:
|
81
|
+
True if the key is in the cache, False otherwise.
|
82
|
+
"""
|
83
|
+
|
84
|
+
@abc.abstractmethod
|
85
|
+
def __getitem__(self, key):
|
86
|
+
"""Retrieve an item from the cache using the square bracket notation.
|
87
|
+
|
88
|
+
Args:
|
89
|
+
key: The key of the item to retrieve.
|
90
|
+
"""
|
91
|
+
|
92
|
+
@abc.abstractmethod
|
93
|
+
def __setitem__(self, key, value) -> None:
|
94
|
+
"""Add an item to the cache using the square bracket notation.
|
95
|
+
|
96
|
+
Args:
|
97
|
+
key: The key of the item.
|
98
|
+
value: The value to cache.
|
99
|
+
"""
|
100
|
+
|
101
|
+
@abc.abstractmethod
|
102
|
+
def __delitem__(self, key) -> None:
|
103
|
+
"""Remove an item from the cache using the square bracket notation.
|
104
|
+
|
105
|
+
Args:
|
106
|
+
key: The key of the item to remove.
|
107
|
+
"""
|
108
|
+
|
109
|
+
|
110
|
+
class AsyncBaseCacheService(CacheServiceProtocol, Generic[AsyncLockType]):
|
111
|
+
"""Abstract base class for a async cache."""
|
112
|
+
|
113
|
+
name = "cache_service"
|
114
|
+
|
115
|
+
@abc.abstractmethod
|
116
|
+
async def get(self, key, lock: AsyncLockType | None = None):
|
117
|
+
"""Retrieve an item from the cache.
|
118
|
+
|
119
|
+
Args:
|
120
|
+
key: The key of the item to retrieve.
|
121
|
+
lock: A lock to use for the operation.
|
122
|
+
|
123
|
+
Returns:
|
124
|
+
The value associated with the key, or CACHE_MISS if the key is not found.
|
125
|
+
"""
|
126
|
+
|
127
|
+
@abc.abstractmethod
|
128
|
+
async def set(self, key, value, lock: AsyncLockType | None = None):
|
129
|
+
"""Add an item to the cache.
|
130
|
+
|
131
|
+
Args:
|
132
|
+
key: The key of the item.
|
133
|
+
value: The value to cache.
|
134
|
+
lock: A lock to use for the operation.
|
135
|
+
"""
|
136
|
+
|
137
|
+
@abc.abstractmethod
|
138
|
+
async def upsert(self, key, value, lock: AsyncLockType | None = None):
|
139
|
+
"""Add an item to the cache if it doesn't exist, or update it if it does.
|
140
|
+
|
141
|
+
Args:
|
142
|
+
key: The key of the item.
|
143
|
+
value: The value to cache.
|
144
|
+
lock: A lock to use for the operation.
|
145
|
+
"""
|
146
|
+
|
147
|
+
@abc.abstractmethod
|
148
|
+
async def delete(self, key, lock: AsyncLockType | None = None):
|
149
|
+
"""Remove an item from the cache.
|
150
|
+
|
151
|
+
Args:
|
152
|
+
key: The key of the item to remove.
|
153
|
+
lock: A lock to use for the operation.
|
154
|
+
"""
|
155
|
+
|
156
|
+
@abc.abstractmethod
|
157
|
+
async def clear(self, lock: AsyncLockType | None = None):
|
158
|
+
"""Clear all items from the cache."""
|
159
|
+
|
160
|
+
@abc.abstractmethod
|
161
|
+
async def contains(self, key) -> bool:
|
162
|
+
"""Check if the key is in the cache.
|
163
|
+
|
164
|
+
Args:
|
165
|
+
key: The key of the item to check.
|
166
|
+
|
167
|
+
Returns:
|
168
|
+
True if the key is in the cache, False otherwise.
|
169
|
+
"""
|
170
|
+
|
171
|
+
|
172
|
+
class ExternalAsyncBaseCacheService(AsyncBaseCacheService):
|
173
|
+
"""Abstract base class for an external async cache."""
|
174
|
+
|
175
|
+
name = "cache_service"
|
176
|
+
|
177
|
+
@abc.abstractmethod
|
178
|
+
async def is_connected(self) -> bool:
|
179
|
+
"""Check if the cache is connected.
|
180
|
+
|
181
|
+
Returns:
|
182
|
+
True if the cache is connected, False otherwise.
|
183
|
+
"""
|