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/memory/stubs.py
ADDED
@@ -0,0 +1,283 @@
|
|
1
|
+
"""Memory management functions for lfx package.
|
2
|
+
|
3
|
+
This module provides message storage and retrieval functionality adapted for lfx's
|
4
|
+
service-based architecture. It mirrors the langflow.memory API but works with
|
5
|
+
lfx's Message model and service interfaces.
|
6
|
+
"""
|
7
|
+
|
8
|
+
from uuid import UUID
|
9
|
+
|
10
|
+
from lfx.log.logger import logger
|
11
|
+
from lfx.schema.message import Message
|
12
|
+
from lfx.services.deps import session_scope
|
13
|
+
from lfx.utils.async_helpers import run_until_complete
|
14
|
+
|
15
|
+
|
16
|
+
async def astore_message(
|
17
|
+
message: Message,
|
18
|
+
flow_id: str | UUID | None = None,
|
19
|
+
) -> list[Message]:
|
20
|
+
"""Store a message in the memory.
|
21
|
+
|
22
|
+
Args:
|
23
|
+
message (Message): The message to store.
|
24
|
+
flow_id (Optional[str | UUID]): The flow ID associated with the message.
|
25
|
+
When running from the CustomComponent you can access this using `self.graph.flow_id`.
|
26
|
+
|
27
|
+
Returns:
|
28
|
+
List[Message]: A list containing the stored message.
|
29
|
+
|
30
|
+
Raises:
|
31
|
+
ValueError: If any of the required parameters (session_id, sender, sender_name) is not provided.
|
32
|
+
"""
|
33
|
+
if not message:
|
34
|
+
logger.warning("No message provided.")
|
35
|
+
return []
|
36
|
+
|
37
|
+
if not message.session_id or not message.sender or not message.sender_name:
|
38
|
+
msg = (
|
39
|
+
f"All of session_id, sender, and sender_name must be provided. Session ID: {message.session_id},"
|
40
|
+
f" Sender: {message.sender}, Sender Name: {message.sender_name}"
|
41
|
+
)
|
42
|
+
raise ValueError(msg)
|
43
|
+
|
44
|
+
# Set flow_id if provided
|
45
|
+
if flow_id:
|
46
|
+
if isinstance(flow_id, str):
|
47
|
+
flow_id = UUID(flow_id)
|
48
|
+
message.flow_id = str(flow_id)
|
49
|
+
|
50
|
+
# In lfx, we use the service architecture - this is a simplified implementation
|
51
|
+
# that doesn't persist to database but maintains the message in memory
|
52
|
+
# Real implementation would require a database service
|
53
|
+
async with session_scope() as session:
|
54
|
+
# Since we're using NoopSession by default, this doesn't actually persist
|
55
|
+
# but maintains the same interface as langflow.memory
|
56
|
+
try:
|
57
|
+
# Generate an ID if not present
|
58
|
+
if not hasattr(message, "id") or not message.id:
|
59
|
+
try:
|
60
|
+
import nanoid
|
61
|
+
|
62
|
+
message.id = nanoid.generate()
|
63
|
+
except ImportError:
|
64
|
+
# Fallback to uuid if nanoid is not available
|
65
|
+
import uuid
|
66
|
+
|
67
|
+
message.id = str(uuid.uuid4())
|
68
|
+
|
69
|
+
await session.add(message)
|
70
|
+
await session.commit()
|
71
|
+
logger.debug(f"Message stored with ID: {message.id}")
|
72
|
+
except Exception as e:
|
73
|
+
logger.exception(f"Error storing message: {e}")
|
74
|
+
await session.rollback()
|
75
|
+
raise
|
76
|
+
return [message]
|
77
|
+
|
78
|
+
|
79
|
+
def store_message(
|
80
|
+
message: Message,
|
81
|
+
flow_id: str | UUID | None = None,
|
82
|
+
) -> list[Message]:
|
83
|
+
"""DEPRECATED: Stores a message in the memory.
|
84
|
+
|
85
|
+
DEPRECATED: Use `astore_message` instead.
|
86
|
+
|
87
|
+
Args:
|
88
|
+
message (Message): The message to store.
|
89
|
+
flow_id (Optional[str | UUID]): The flow ID associated with the message.
|
90
|
+
When running from the CustomComponent you can access this using `self.graph.flow_id`.
|
91
|
+
|
92
|
+
Returns:
|
93
|
+
List[Message]: A list containing the stored message.
|
94
|
+
|
95
|
+
Raises:
|
96
|
+
ValueError: If any of the required parameters (session_id, sender, sender_name) is not provided.
|
97
|
+
"""
|
98
|
+
return run_until_complete(astore_message(message, flow_id=flow_id))
|
99
|
+
|
100
|
+
|
101
|
+
async def aupdate_messages(messages: Message | list[Message]) -> list[Message]:
|
102
|
+
"""Update stored messages.
|
103
|
+
|
104
|
+
Args:
|
105
|
+
messages: Message or list of messages to update.
|
106
|
+
|
107
|
+
Returns:
|
108
|
+
List[Message]: Updated messages.
|
109
|
+
|
110
|
+
Raises:
|
111
|
+
ValueError: If message is not found for update.
|
112
|
+
"""
|
113
|
+
if not isinstance(messages, list):
|
114
|
+
messages = [messages]
|
115
|
+
|
116
|
+
async with session_scope() as session:
|
117
|
+
updated_messages: list[Message] = []
|
118
|
+
for message in messages:
|
119
|
+
try:
|
120
|
+
# In a real implementation, this would update the database record
|
121
|
+
# For now, we just validate the message has an ID and return it
|
122
|
+
if not hasattr(message, "id") or not message.id:
|
123
|
+
error_message = f"Message without ID cannot be updated: {message}"
|
124
|
+
logger.warning(error_message)
|
125
|
+
raise ValueError(error_message)
|
126
|
+
|
127
|
+
# Convert flow_id to string if it's a UUID
|
128
|
+
if message.flow_id and isinstance(message.flow_id, UUID):
|
129
|
+
message.flow_id = str(message.flow_id)
|
130
|
+
|
131
|
+
await session.add(message)
|
132
|
+
await session.commit()
|
133
|
+
await session.refresh(message)
|
134
|
+
updated_messages.append(message)
|
135
|
+
logger.debug(f"Message updated: {message.id}")
|
136
|
+
except Exception as e:
|
137
|
+
logger.exception(f"Error updating message: {e}")
|
138
|
+
await session.rollback()
|
139
|
+
msg = f"Failed to update message: {e}"
|
140
|
+
logger.error(msg)
|
141
|
+
raise ValueError(msg) from e
|
142
|
+
|
143
|
+
return updated_messages
|
144
|
+
|
145
|
+
|
146
|
+
async def delete_message(id_: str) -> None:
|
147
|
+
"""Delete a message from the memory.
|
148
|
+
|
149
|
+
Args:
|
150
|
+
id_ (str): The ID of the message to delete.
|
151
|
+
"""
|
152
|
+
async with session_scope() as session:
|
153
|
+
try:
|
154
|
+
# In a real implementation, this would delete from database
|
155
|
+
# For now, this is a no-op since we're using NoopSession
|
156
|
+
await session.delete(id_)
|
157
|
+
await session.commit()
|
158
|
+
logger.debug(f"Message deleted: {id_}")
|
159
|
+
except Exception as e:
|
160
|
+
logger.exception(f"Error deleting message: {e}")
|
161
|
+
raise
|
162
|
+
|
163
|
+
|
164
|
+
async def aget_messages(
|
165
|
+
sender: str | None = None, # noqa: ARG001
|
166
|
+
sender_name: str | None = None, # noqa: ARG001
|
167
|
+
session_id: str | UUID | None = None, # noqa: ARG001
|
168
|
+
order_by: str | None = "timestamp", # noqa: ARG001
|
169
|
+
order: str | None = "DESC", # noqa: ARG001
|
170
|
+
flow_id: UUID | None = None, # noqa: ARG001
|
171
|
+
limit: int | None = None, # noqa: ARG001
|
172
|
+
) -> list[Message]:
|
173
|
+
"""Retrieve messages based on the provided filters.
|
174
|
+
|
175
|
+
Args:
|
176
|
+
sender (Optional[str]): The sender of the messages (e.g., "Machine" or "User")
|
177
|
+
sender_name (Optional[str]): The name of the sender.
|
178
|
+
session_id (Optional[str]): The session ID associated with the messages.
|
179
|
+
order_by (Optional[str]): The field to order the messages by. Defaults to "timestamp".
|
180
|
+
order (Optional[str]): The order in which to retrieve the messages. Defaults to "DESC".
|
181
|
+
flow_id (Optional[UUID]): The flow ID associated with the messages.
|
182
|
+
limit (Optional[int]): The maximum number of messages to retrieve.
|
183
|
+
|
184
|
+
Returns:
|
185
|
+
List[Message]: A list of Message objects representing the retrieved messages.
|
186
|
+
"""
|
187
|
+
async with session_scope() as session:
|
188
|
+
try:
|
189
|
+
# In a real implementation, this would query the database
|
190
|
+
# For now, return empty list since we're using NoopSession
|
191
|
+
result = await session.query() # This returns [] from NoopSession
|
192
|
+
logger.debug(f"Retrieved {len(result)} messages")
|
193
|
+
except Exception as e: # noqa: BLE001
|
194
|
+
logger.exception(f"Error retrieving messages: {e}")
|
195
|
+
return []
|
196
|
+
return result
|
197
|
+
|
198
|
+
|
199
|
+
def get_messages(
|
200
|
+
sender: str | None = None,
|
201
|
+
sender_name: str | None = None,
|
202
|
+
session_id: str | UUID | None = None,
|
203
|
+
order_by: str | None = "timestamp",
|
204
|
+
order: str | None = "DESC",
|
205
|
+
flow_id: UUID | None = None,
|
206
|
+
limit: int | None = None,
|
207
|
+
) -> list[Message]:
|
208
|
+
"""DEPRECATED - Retrieve messages based on the provided filters.
|
209
|
+
|
210
|
+
DEPRECATED: Use `aget_messages` instead.
|
211
|
+
"""
|
212
|
+
return run_until_complete(aget_messages(sender, sender_name, session_id, order_by, order, flow_id, limit))
|
213
|
+
|
214
|
+
|
215
|
+
async def adelete_messages(session_id: str) -> None:
|
216
|
+
"""Delete messages from the memory based on the provided session ID.
|
217
|
+
|
218
|
+
Args:
|
219
|
+
session_id (str): The session ID associated with the messages to delete.
|
220
|
+
"""
|
221
|
+
async with session_scope() as session:
|
222
|
+
try:
|
223
|
+
# In a real implementation, this would delete from database
|
224
|
+
# For now, this is a no-op since we're using NoopSession
|
225
|
+
await session.delete(session_id)
|
226
|
+
await session.commit()
|
227
|
+
logger.debug(f"Messages deleted for session: {session_id}")
|
228
|
+
except Exception as e:
|
229
|
+
logger.exception(f"Error deleting messages: {e}")
|
230
|
+
raise
|
231
|
+
|
232
|
+
|
233
|
+
def delete_messages(session_id: str) -> None:
|
234
|
+
"""DEPRECATED - Delete messages based on the provided session ID.
|
235
|
+
|
236
|
+
DEPRECATED: Use `adelete_messages` instead.
|
237
|
+
"""
|
238
|
+
return run_until_complete(adelete_messages(session_id))
|
239
|
+
|
240
|
+
|
241
|
+
async def aadd_messages(messages: Message | list[Message]) -> list[Message]:
|
242
|
+
"""Add messages to the memory.
|
243
|
+
|
244
|
+
Args:
|
245
|
+
messages: Message or list of messages to add.
|
246
|
+
|
247
|
+
Returns:
|
248
|
+
List[Message]: Added messages.
|
249
|
+
"""
|
250
|
+
if not isinstance(messages, list):
|
251
|
+
messages = [messages]
|
252
|
+
|
253
|
+
result = []
|
254
|
+
for message in messages:
|
255
|
+
stored = await astore_message(message)
|
256
|
+
result.extend(stored)
|
257
|
+
return result
|
258
|
+
|
259
|
+
|
260
|
+
def add_messages(messages: Message | list[Message]) -> list[Message]:
|
261
|
+
"""Add messages to the memory (synchronous version).
|
262
|
+
|
263
|
+
Args:
|
264
|
+
messages: Message or list of messages to add.
|
265
|
+
|
266
|
+
Returns:
|
267
|
+
List[Message]: Added messages.
|
268
|
+
"""
|
269
|
+
return run_until_complete(aadd_messages(messages))
|
270
|
+
|
271
|
+
|
272
|
+
async def aadd_messagetables(messages: Message | list[Message]) -> list[Message]:
|
273
|
+
"""Add message tables to the memory.
|
274
|
+
|
275
|
+
This is an alias for aadd_messages for backwards compatibility.
|
276
|
+
|
277
|
+
Args:
|
278
|
+
messages: Message or list of messages to add.
|
279
|
+
|
280
|
+
Returns:
|
281
|
+
List[Message]: Added messages.
|
282
|
+
"""
|
283
|
+
return await aadd_messages(messages)
|
@@ -0,0 +1 @@
|
|
1
|
+
"""Processing module for lfx package."""
|
@@ -0,0 +1,238 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import json
|
4
|
+
from typing import TYPE_CHECKING, Any, cast
|
5
|
+
|
6
|
+
from json_repair import repair_json
|
7
|
+
from pydantic import BaseModel
|
8
|
+
|
9
|
+
from lfx.graph.vertex.base import Vertex
|
10
|
+
from lfx.log.logger import logger
|
11
|
+
from lfx.schema.graph import InputValue, Tweaks
|
12
|
+
from lfx.schema.schema import INPUT_FIELD_NAME, InputValueRequest
|
13
|
+
from lfx.services.deps import get_settings_service
|
14
|
+
|
15
|
+
if TYPE_CHECKING:
|
16
|
+
from lfx.events.event_manager import EventManager
|
17
|
+
from lfx.graph.graph.base import Graph
|
18
|
+
from lfx.graph.schema import RunOutputs
|
19
|
+
|
20
|
+
|
21
|
+
def validate_and_repair_json(json_str: str | dict) -> dict[str, Any] | str:
|
22
|
+
"""Validates a JSON string and attempts to repair it if invalid.
|
23
|
+
|
24
|
+
Args:
|
25
|
+
json_str (str): The JSON string to validate/repair
|
26
|
+
|
27
|
+
Returns:
|
28
|
+
Union[Dict[str, Any], str]: The parsed JSON dict if valid/repairable,
|
29
|
+
otherwise returns the original string
|
30
|
+
"""
|
31
|
+
if not isinstance(json_str, str):
|
32
|
+
return json_str
|
33
|
+
try:
|
34
|
+
# If invalid, attempt repair
|
35
|
+
repaired = repair_json(json_str)
|
36
|
+
return json.loads(repaired)
|
37
|
+
except (json.JSONDecodeError, ImportError):
|
38
|
+
# Return original if repair fails or module not found
|
39
|
+
return json_str
|
40
|
+
|
41
|
+
|
42
|
+
class Result(BaseModel):
|
43
|
+
result: Any
|
44
|
+
session_id: str
|
45
|
+
|
46
|
+
|
47
|
+
async def run_graph_internal(
|
48
|
+
graph: Graph,
|
49
|
+
flow_id: str,
|
50
|
+
*,
|
51
|
+
stream: bool = False,
|
52
|
+
session_id: str | None = None,
|
53
|
+
inputs: list[InputValueRequest] | None = None,
|
54
|
+
outputs: list[str] | None = None,
|
55
|
+
event_manager: EventManager | None = None,
|
56
|
+
) -> tuple[list[RunOutputs], str]:
|
57
|
+
"""Run the graph and generate the result."""
|
58
|
+
inputs = inputs or []
|
59
|
+
effective_session_id = session_id or flow_id
|
60
|
+
components = []
|
61
|
+
inputs_list = []
|
62
|
+
types = []
|
63
|
+
for input_value_request in inputs:
|
64
|
+
if input_value_request.input_value is None:
|
65
|
+
logger.warning("InputValueRequest input_value cannot be None, defaulting to an empty string.")
|
66
|
+
input_value_request.input_value = ""
|
67
|
+
components.append(input_value_request.components or [])
|
68
|
+
inputs_list.append({INPUT_FIELD_NAME: input_value_request.input_value})
|
69
|
+
types.append(input_value_request.type)
|
70
|
+
|
71
|
+
try:
|
72
|
+
fallback_to_env_vars = get_settings_service().settings.fallback_to_env_var
|
73
|
+
except (AttributeError, TypeError):
|
74
|
+
fallback_to_env_vars = False
|
75
|
+
|
76
|
+
graph.session_id = effective_session_id
|
77
|
+
run_outputs = await graph.arun(
|
78
|
+
inputs=inputs_list,
|
79
|
+
inputs_components=components,
|
80
|
+
types=types,
|
81
|
+
outputs=outputs or [],
|
82
|
+
stream=stream,
|
83
|
+
session_id=effective_session_id or "",
|
84
|
+
fallback_to_env_vars=fallback_to_env_vars,
|
85
|
+
event_manager=event_manager,
|
86
|
+
)
|
87
|
+
return run_outputs, effective_session_id
|
88
|
+
|
89
|
+
|
90
|
+
async def run_graph(
|
91
|
+
graph: Graph,
|
92
|
+
input_value: str,
|
93
|
+
input_type: str,
|
94
|
+
output_type: str,
|
95
|
+
*,
|
96
|
+
session_id: str | None = None,
|
97
|
+
fallback_to_env_vars: bool = False,
|
98
|
+
output_component: str | None = None,
|
99
|
+
stream: bool = False,
|
100
|
+
) -> list[RunOutputs]:
|
101
|
+
"""Runs the given Langflow Graph with the specified input and returns the outputs.
|
102
|
+
|
103
|
+
Args:
|
104
|
+
graph (Graph): The graph to be executed.
|
105
|
+
input_value (str): The input value to be passed to the graph.
|
106
|
+
input_type (str): The type of the input value.
|
107
|
+
output_type (str): The type of the desired output.
|
108
|
+
session_id (str | None, optional): The session ID to be used for the flow. Defaults to None.
|
109
|
+
fallback_to_env_vars (bool, optional): Whether to fallback to environment variables.
|
110
|
+
Defaults to False.
|
111
|
+
output_component (Optional[str], optional): The specific output component to retrieve. Defaults to None.
|
112
|
+
stream (bool, optional): Whether to stream the results or not. Defaults to False.
|
113
|
+
|
114
|
+
Returns:
|
115
|
+
List[RunOutputs]: A list of RunOutputs objects representing the outputs of the graph.
|
116
|
+
|
117
|
+
"""
|
118
|
+
inputs = [InputValue(components=[], input_value=input_value, type=input_type)]
|
119
|
+
if output_component:
|
120
|
+
outputs = [output_component]
|
121
|
+
else:
|
122
|
+
outputs = [
|
123
|
+
vertex.id
|
124
|
+
for vertex in graph.vertices
|
125
|
+
if output_type == "debug"
|
126
|
+
or (vertex.is_output and (output_type == "any" or output_type in vertex.id.lower()))
|
127
|
+
]
|
128
|
+
components = []
|
129
|
+
inputs_list = []
|
130
|
+
types = []
|
131
|
+
for input_value_request in inputs:
|
132
|
+
if input_value_request.input_value is None:
|
133
|
+
logger.warning("InputValueRequest input_value cannot be None, defaulting to an empty string.")
|
134
|
+
input_value_request.input_value = ""
|
135
|
+
components.append(input_value_request.components or [])
|
136
|
+
inputs_list.append({INPUT_FIELD_NAME: input_value_request.input_value})
|
137
|
+
types.append(input_value_request.type)
|
138
|
+
return await graph.arun(
|
139
|
+
inputs_list,
|
140
|
+
inputs_components=components,
|
141
|
+
types=types,
|
142
|
+
outputs=outputs or [],
|
143
|
+
stream=stream,
|
144
|
+
session_id=session_id,
|
145
|
+
fallback_to_env_vars=fallback_to_env_vars,
|
146
|
+
)
|
147
|
+
|
148
|
+
|
149
|
+
def validate_input(
|
150
|
+
graph_data: dict[str, Any], tweaks: Tweaks | dict[str, str | dict[str, Any]]
|
151
|
+
) -> list[dict[str, Any]]:
|
152
|
+
if not isinstance(graph_data, dict) or not isinstance(tweaks, dict):
|
153
|
+
msg = "graph_data and tweaks should be dictionaries"
|
154
|
+
raise TypeError(msg)
|
155
|
+
|
156
|
+
nodes = graph_data.get("data", {}).get("nodes") or graph_data.get("nodes")
|
157
|
+
|
158
|
+
if not isinstance(nodes, list):
|
159
|
+
msg = "graph_data should contain a list of nodes under 'data' key or directly under 'nodes' key"
|
160
|
+
raise TypeError(msg)
|
161
|
+
|
162
|
+
return nodes
|
163
|
+
|
164
|
+
|
165
|
+
def apply_tweaks(node: dict[str, Any], node_tweaks: dict[str, Any]) -> None:
|
166
|
+
template_data = node.get("data", {}).get("node", {}).get("template")
|
167
|
+
|
168
|
+
if not isinstance(template_data, dict):
|
169
|
+
logger.warning(f"Template data for node {node.get('id')} should be a dictionary")
|
170
|
+
return
|
171
|
+
|
172
|
+
for tweak_name, tweak_value in node_tweaks.items():
|
173
|
+
if tweak_name not in template_data:
|
174
|
+
continue
|
175
|
+
if tweak_name in template_data:
|
176
|
+
if template_data[tweak_name]["type"] == "NestedDict":
|
177
|
+
value = validate_and_repair_json(tweak_value)
|
178
|
+
template_data[tweak_name]["value"] = value
|
179
|
+
elif isinstance(tweak_value, dict):
|
180
|
+
for k, v in tweak_value.items():
|
181
|
+
k_ = "file_path" if template_data[tweak_name]["type"] == "file" else k
|
182
|
+
template_data[tweak_name][k_] = v
|
183
|
+
else:
|
184
|
+
key = "file_path" if template_data[tweak_name]["type"] == "file" else "value"
|
185
|
+
template_data[tweak_name][key] = tweak_value
|
186
|
+
|
187
|
+
|
188
|
+
def apply_tweaks_on_vertex(vertex: Vertex, node_tweaks: dict[str, Any]) -> None:
|
189
|
+
for tweak_name, tweak_value in node_tweaks.items():
|
190
|
+
if tweak_name and tweak_value and tweak_name in vertex.params:
|
191
|
+
vertex.params[tweak_name] = tweak_value
|
192
|
+
|
193
|
+
|
194
|
+
def process_tweaks(
|
195
|
+
graph_data: dict[str, Any], tweaks: Tweaks | dict[str, dict[str, Any]], *, stream: bool = False
|
196
|
+
) -> dict[str, Any]:
|
197
|
+
"""This function is used to tweak the graph data using the node id and the tweaks dict.
|
198
|
+
|
199
|
+
:param graph_data: The dictionary containing the graph data. It must contain a 'data' key with
|
200
|
+
'nodes' as its child or directly contain 'nodes' key. Each node should have an 'id' and 'data'.
|
201
|
+
:param tweaks: The dictionary containing the tweaks. The keys can be the node id or the name of the tweak.
|
202
|
+
The values can be a dictionary containing the tweaks for the node or the value of the tweak.
|
203
|
+
:param stream: A boolean flag indicating whether streaming should be deactivated across all components or not.
|
204
|
+
Default is False.
|
205
|
+
:return: The modified graph_data dictionary.
|
206
|
+
:raises ValueError: If the input is not in the expected format.
|
207
|
+
"""
|
208
|
+
tweaks_dict = cast("dict[str, Any]", tweaks.model_dump()) if not isinstance(tweaks, dict) else tweaks
|
209
|
+
if "stream" not in tweaks_dict:
|
210
|
+
tweaks_dict |= {"stream": stream}
|
211
|
+
nodes = validate_input(graph_data, cast("dict[str, str | dict[str, Any]]", tweaks_dict))
|
212
|
+
nodes_map = {node.get("id"): node for node in nodes}
|
213
|
+
nodes_display_name_map = {node.get("data", {}).get("node", {}).get("display_name"): node for node in nodes}
|
214
|
+
|
215
|
+
all_nodes_tweaks = {}
|
216
|
+
for key, value in tweaks_dict.items():
|
217
|
+
if isinstance(value, dict):
|
218
|
+
if (node := nodes_map.get(key)) or (node := nodes_display_name_map.get(key)):
|
219
|
+
apply_tweaks(node, value)
|
220
|
+
else:
|
221
|
+
all_nodes_tweaks[key] = value
|
222
|
+
if all_nodes_tweaks:
|
223
|
+
for node in nodes:
|
224
|
+
apply_tweaks(node, all_nodes_tweaks)
|
225
|
+
|
226
|
+
return graph_data
|
227
|
+
|
228
|
+
|
229
|
+
def process_tweaks_on_graph(graph: Graph, tweaks: dict[str, dict[str, Any]]):
|
230
|
+
for vertex in graph.vertices:
|
231
|
+
if isinstance(vertex, Vertex) and isinstance(vertex.id, str):
|
232
|
+
node_id = vertex.id
|
233
|
+
if node_tweaks := tweaks.get(node_id):
|
234
|
+
apply_tweaks_on_vertex(vertex, node_tweaks)
|
235
|
+
else:
|
236
|
+
logger.warning("Each node should be a Vertex with an 'id' attribute of type str")
|
237
|
+
|
238
|
+
return graph
|
lfx/processing/utils.py
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
import json
|
2
|
+
from typing import Any
|
3
|
+
|
4
|
+
from json_repair import repair_json
|
5
|
+
|
6
|
+
|
7
|
+
def validate_and_repair_json(json_str: str | dict) -> dict[str, Any] | str:
|
8
|
+
"""Validates a JSON string and attempts to repair it if invalid.
|
9
|
+
|
10
|
+
Args:
|
11
|
+
json_str (str): The JSON string to validate/repair
|
12
|
+
|
13
|
+
Returns:
|
14
|
+
Union[Dict[str, Any], str]: The parsed JSON dict if valid/repairable,
|
15
|
+
otherwise returns the original string
|
16
|
+
"""
|
17
|
+
if not isinstance(json_str, str):
|
18
|
+
return json_str
|
19
|
+
try:
|
20
|
+
# If invalid, attempt repair
|
21
|
+
repaired = repair_json(json_str)
|
22
|
+
return json.loads(repaired)
|
23
|
+
except (json.JSONDecodeError, ImportError):
|
24
|
+
# Return original if repair fails or module not found
|
25
|
+
return json_str
|
lfx/py.typed
ADDED
File without changes
|
lfx/schema/__init__.py
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
"""Schema modules for lfx package."""
|
2
|
+
|
3
|
+
__all__ = [
|
4
|
+
"Data",
|
5
|
+
"DataFrame",
|
6
|
+
"InputValue",
|
7
|
+
"Message",
|
8
|
+
"OpenAIErrorResponse",
|
9
|
+
"OpenAIResponsesRequest",
|
10
|
+
"OpenAIResponsesResponse",
|
11
|
+
"OpenAIResponsesStreamChunk",
|
12
|
+
"Tweaks",
|
13
|
+
"UUIDstr",
|
14
|
+
"dotdict",
|
15
|
+
]
|
16
|
+
|
17
|
+
|
18
|
+
def __getattr__(name: str):
|
19
|
+
# Import to avoid circular dependencies
|
20
|
+
if name == "Data":
|
21
|
+
from .data import Data
|
22
|
+
|
23
|
+
return Data
|
24
|
+
if name == "DataFrame":
|
25
|
+
from .dataframe import DataFrame
|
26
|
+
|
27
|
+
return DataFrame
|
28
|
+
if name == "dotdict":
|
29
|
+
from .dotdict import dotdict
|
30
|
+
|
31
|
+
return dotdict
|
32
|
+
if name == "InputValue":
|
33
|
+
from .graph import InputValue
|
34
|
+
|
35
|
+
return InputValue
|
36
|
+
if name == "Tweaks":
|
37
|
+
from .graph import Tweaks
|
38
|
+
|
39
|
+
return Tweaks
|
40
|
+
if name == "Message":
|
41
|
+
from .message import Message
|
42
|
+
|
43
|
+
return Message
|
44
|
+
if name == "UUIDstr":
|
45
|
+
from .serialize import UUIDstr
|
46
|
+
|
47
|
+
return UUIDstr
|
48
|
+
if name == "OpenAIResponsesRequest":
|
49
|
+
from .openai_responses_schemas import OpenAIResponsesRequest
|
50
|
+
|
51
|
+
return OpenAIResponsesRequest
|
52
|
+
if name == "OpenAIResponsesResponse":
|
53
|
+
from .openai_responses_schemas import OpenAIResponsesResponse
|
54
|
+
|
55
|
+
return OpenAIResponsesResponse
|
56
|
+
if name == "OpenAIResponsesStreamChunk":
|
57
|
+
from .openai_responses_schemas import OpenAIResponsesStreamChunk
|
58
|
+
|
59
|
+
return OpenAIResponsesStreamChunk
|
60
|
+
if name == "OpenAIErrorResponse":
|
61
|
+
from .openai_responses_schemas import OpenAIErrorResponse
|
62
|
+
|
63
|
+
return OpenAIErrorResponse
|
64
|
+
|
65
|
+
msg = f"module '{__name__}' has no attribute '{name}'"
|
66
|
+
raise AttributeError(msg)
|
lfx/schema/artifact.py
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
from collections.abc import Generator
|
2
|
+
from enum import Enum
|
3
|
+
|
4
|
+
from fastapi.encoders import jsonable_encoder
|
5
|
+
from pydantic import BaseModel
|
6
|
+
|
7
|
+
from lfx.log.logger import logger
|
8
|
+
from lfx.schema.data import Data
|
9
|
+
from lfx.schema.dataframe import DataFrame
|
10
|
+
from lfx.schema.encoders import CUSTOM_ENCODERS
|
11
|
+
from lfx.schema.message import Message
|
12
|
+
from lfx.serialization.serialization import serialize
|
13
|
+
|
14
|
+
|
15
|
+
class ArtifactType(str, Enum):
|
16
|
+
TEXT = "text"
|
17
|
+
DATA = "data"
|
18
|
+
OBJECT = "object"
|
19
|
+
ARRAY = "array"
|
20
|
+
STREAM = "stream"
|
21
|
+
UNKNOWN = "unknown"
|
22
|
+
MESSAGE = "message"
|
23
|
+
RECORD = "record"
|
24
|
+
|
25
|
+
|
26
|
+
def get_artifact_type(value, build_result=None) -> str:
|
27
|
+
result = ArtifactType.UNKNOWN
|
28
|
+
match value:
|
29
|
+
case Message():
|
30
|
+
if not isinstance(value.text, str):
|
31
|
+
enum_value = get_artifact_type(value.text)
|
32
|
+
result = ArtifactType(enum_value)
|
33
|
+
else:
|
34
|
+
result = ArtifactType.MESSAGE
|
35
|
+
case Data():
|
36
|
+
enum_value = get_artifact_type(value.data)
|
37
|
+
result = ArtifactType(enum_value)
|
38
|
+
|
39
|
+
case str():
|
40
|
+
result = ArtifactType.TEXT
|
41
|
+
|
42
|
+
case dict():
|
43
|
+
result = ArtifactType.OBJECT
|
44
|
+
|
45
|
+
case list() | DataFrame():
|
46
|
+
result = ArtifactType.ARRAY
|
47
|
+
if result == ArtifactType.UNKNOWN and (
|
48
|
+
(build_result and isinstance(build_result, Generator))
|
49
|
+
or (isinstance(value, Message) and isinstance(value.text, Generator))
|
50
|
+
):
|
51
|
+
result = ArtifactType.STREAM
|
52
|
+
|
53
|
+
return result.value
|
54
|
+
|
55
|
+
|
56
|
+
def _to_list_of_dicts(raw):
|
57
|
+
raw_ = []
|
58
|
+
for item in raw:
|
59
|
+
if hasattr(item, "dict") or hasattr(item, "model_dump"):
|
60
|
+
raw_.append(serialize(item))
|
61
|
+
else:
|
62
|
+
raw_.append(str(item))
|
63
|
+
return raw_
|
64
|
+
|
65
|
+
|
66
|
+
def post_process_raw(raw, artifact_type: str):
|
67
|
+
default_message = "Built Successfully ✨"
|
68
|
+
|
69
|
+
if artifact_type == ArtifactType.STREAM.value:
|
70
|
+
raw = ""
|
71
|
+
elif artifact_type == ArtifactType.ARRAY.value:
|
72
|
+
raw = raw.to_dict(orient="records") if isinstance(raw, DataFrame) else _to_list_of_dicts(raw)
|
73
|
+
elif artifact_type == ArtifactType.UNKNOWN.value and raw is not None:
|
74
|
+
if isinstance(raw, BaseModel | dict):
|
75
|
+
try:
|
76
|
+
raw = jsonable_encoder(raw, custom_encoder=CUSTOM_ENCODERS)
|
77
|
+
artifact_type = ArtifactType.OBJECT.value
|
78
|
+
except Exception: # noqa: BLE001
|
79
|
+
logger.debug(f"Error converting to json: {raw} ({type(raw)})", exc_info=True)
|
80
|
+
raw = default_message
|
81
|
+
else:
|
82
|
+
raw = default_message
|
83
|
+
return raw, artifact_type
|