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,224 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import inspect
|
4
|
+
import os
|
5
|
+
import warnings
|
6
|
+
from typing import TYPE_CHECKING, Any
|
7
|
+
|
8
|
+
import orjson
|
9
|
+
from pydantic import PydanticDeprecatedSince20
|
10
|
+
|
11
|
+
from lfx.custom.eval import eval_custom_component_code
|
12
|
+
from lfx.log.logger import logger
|
13
|
+
from lfx.schema.artifact import get_artifact_type, post_process_raw
|
14
|
+
from lfx.schema.data import Data
|
15
|
+
from lfx.services.deps import get_settings_service, session_scope
|
16
|
+
from lfx.services.session import NoopSession
|
17
|
+
|
18
|
+
if TYPE_CHECKING:
|
19
|
+
from lfx.custom.custom_component.component import Component
|
20
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
21
|
+
from lfx.graph.vertex.base import Vertex
|
22
|
+
|
23
|
+
# This is forward declared to avoid circular import
|
24
|
+
class EventManager:
|
25
|
+
pass
|
26
|
+
|
27
|
+
|
28
|
+
def instantiate_class(
|
29
|
+
vertex: Vertex,
|
30
|
+
user_id=None,
|
31
|
+
event_manager: EventManager | None = None,
|
32
|
+
) -> Any:
|
33
|
+
"""Instantiate class from module type and key, and params."""
|
34
|
+
vertex_type = vertex.vertex_type
|
35
|
+
base_type = vertex.base_type
|
36
|
+
logger.debug(f"Instantiating {vertex_type} of type {base_type}")
|
37
|
+
|
38
|
+
if not base_type:
|
39
|
+
msg = "No base type provided for vertex"
|
40
|
+
raise ValueError(msg)
|
41
|
+
|
42
|
+
custom_params = get_params(vertex.params)
|
43
|
+
code = custom_params.pop("code")
|
44
|
+
class_object: type[CustomComponent | Component] = eval_custom_component_code(code)
|
45
|
+
custom_component: CustomComponent | Component = class_object(
|
46
|
+
_user_id=user_id,
|
47
|
+
_parameters=custom_params,
|
48
|
+
_vertex=vertex,
|
49
|
+
_tracing_service=None,
|
50
|
+
_id=vertex.id,
|
51
|
+
)
|
52
|
+
if hasattr(custom_component, "set_event_manager"):
|
53
|
+
custom_component.set_event_manager(event_manager)
|
54
|
+
return custom_component, custom_params
|
55
|
+
|
56
|
+
|
57
|
+
async def get_instance_results(
|
58
|
+
custom_component,
|
59
|
+
custom_params: dict,
|
60
|
+
vertex: Vertex,
|
61
|
+
*,
|
62
|
+
fallback_to_env_vars: bool = False,
|
63
|
+
base_type: str = "component",
|
64
|
+
):
|
65
|
+
custom_params = await update_params_with_load_from_db_fields(
|
66
|
+
custom_component,
|
67
|
+
custom_params,
|
68
|
+
vertex.load_from_db_fields,
|
69
|
+
fallback_to_env_vars=fallback_to_env_vars,
|
70
|
+
)
|
71
|
+
with warnings.catch_warnings():
|
72
|
+
warnings.filterwarnings("ignore", category=PydanticDeprecatedSince20)
|
73
|
+
if base_type == "custom_components":
|
74
|
+
return await build_custom_component(params=custom_params, custom_component=custom_component)
|
75
|
+
if base_type == "component":
|
76
|
+
return await build_component(params=custom_params, custom_component=custom_component)
|
77
|
+
msg = f"Base type {base_type} not found."
|
78
|
+
raise ValueError(msg)
|
79
|
+
|
80
|
+
|
81
|
+
def get_params(vertex_params):
|
82
|
+
params = vertex_params
|
83
|
+
params = convert_params_to_sets(params)
|
84
|
+
params = convert_kwargs(params)
|
85
|
+
return params.copy()
|
86
|
+
|
87
|
+
|
88
|
+
def convert_params_to_sets(params):
|
89
|
+
"""Convert certain params to sets."""
|
90
|
+
if "allowed_special" in params:
|
91
|
+
params["allowed_special"] = set(params["allowed_special"])
|
92
|
+
if "disallowed_special" in params:
|
93
|
+
params["disallowed_special"] = set(params["disallowed_special"])
|
94
|
+
return params
|
95
|
+
|
96
|
+
|
97
|
+
def convert_kwargs(params):
|
98
|
+
# Loop through items to avoid repeated lookups
|
99
|
+
items_to_remove = []
|
100
|
+
for key, value in params.items():
|
101
|
+
if ("kwargs" in key or "config" in key) and isinstance(value, str):
|
102
|
+
try:
|
103
|
+
params[key] = orjson.loads(value)
|
104
|
+
except orjson.JSONDecodeError:
|
105
|
+
items_to_remove.append(key)
|
106
|
+
|
107
|
+
# Remove invalid keys outside the loop to avoid modifying dict during iteration
|
108
|
+
for key in items_to_remove:
|
109
|
+
params.pop(key, None)
|
110
|
+
|
111
|
+
return params
|
112
|
+
|
113
|
+
|
114
|
+
def load_from_env_vars(params, load_from_db_fields):
|
115
|
+
for field in load_from_db_fields:
|
116
|
+
if field not in params or not params[field]:
|
117
|
+
continue
|
118
|
+
key = os.getenv(params[field])
|
119
|
+
if key:
|
120
|
+
logger.info(f"Using environment variable {params[field]} for {field}")
|
121
|
+
else:
|
122
|
+
logger.error(f"Environment variable {params[field]} is not set.")
|
123
|
+
params[field] = key if key is not None else None
|
124
|
+
if key is None:
|
125
|
+
logger.warning(f"Could not get value for {field}. Setting it to None.")
|
126
|
+
return params
|
127
|
+
|
128
|
+
|
129
|
+
async def update_params_with_load_from_db_fields(
|
130
|
+
custom_component: CustomComponent,
|
131
|
+
params,
|
132
|
+
load_from_db_fields,
|
133
|
+
*,
|
134
|
+
fallback_to_env_vars=False,
|
135
|
+
):
|
136
|
+
async with session_scope() as session:
|
137
|
+
settings_service = get_settings_service()
|
138
|
+
is_noop_session = isinstance(session, NoopSession) or (
|
139
|
+
settings_service and settings_service.settings.use_noop_database
|
140
|
+
)
|
141
|
+
if is_noop_session:
|
142
|
+
logger.debug("Loading variables from environment variables because database is not available.")
|
143
|
+
return load_from_env_vars(params, load_from_db_fields)
|
144
|
+
for field in load_from_db_fields:
|
145
|
+
if field not in params or not params[field]:
|
146
|
+
continue
|
147
|
+
|
148
|
+
try:
|
149
|
+
key = await custom_component.get_variable(name=params[field], field=field, session=session)
|
150
|
+
except ValueError as e:
|
151
|
+
if any(reason in str(e) for reason in ["User id is not set", "variable not found."]):
|
152
|
+
raise
|
153
|
+
logger.debug(str(e))
|
154
|
+
key = None
|
155
|
+
|
156
|
+
if fallback_to_env_vars and key is None:
|
157
|
+
key = os.getenv(params[field])
|
158
|
+
if key:
|
159
|
+
logger.info(f"Using environment variable {params[field]} for {field}")
|
160
|
+
else:
|
161
|
+
logger.error(f"Environment variable {params[field]} is not set.")
|
162
|
+
|
163
|
+
params[field] = key if key is not None else None
|
164
|
+
if key is None:
|
165
|
+
logger.warning(f"Could not get value for {field}. Setting it to None.")
|
166
|
+
|
167
|
+
return params
|
168
|
+
|
169
|
+
|
170
|
+
async def build_component(
|
171
|
+
params: dict,
|
172
|
+
custom_component: Component,
|
173
|
+
):
|
174
|
+
# Now set the params as attributes of the custom_component
|
175
|
+
custom_component.set_attributes(params)
|
176
|
+
build_results, artifacts = await custom_component.build_results()
|
177
|
+
|
178
|
+
return custom_component, build_results, artifacts
|
179
|
+
|
180
|
+
|
181
|
+
async def build_custom_component(params: dict, custom_component: CustomComponent):
|
182
|
+
if "retriever" in params and hasattr(params["retriever"], "as_retriever"):
|
183
|
+
params["retriever"] = params["retriever"].as_retriever()
|
184
|
+
|
185
|
+
# Determine if the build method is asynchronous
|
186
|
+
is_async = inspect.iscoroutinefunction(custom_component.build)
|
187
|
+
|
188
|
+
# New feature: the component has a list of outputs and we have
|
189
|
+
# to check the vertex.edges to see which is connected (coulb be multiple)
|
190
|
+
# and then we'll get the output which has the name of the method we should call.
|
191
|
+
# the methods don't require any params because they are already set in the custom_component
|
192
|
+
# so we can just call them
|
193
|
+
|
194
|
+
if is_async:
|
195
|
+
# Await the build method directly if it's async
|
196
|
+
build_result = await custom_component.build(**params)
|
197
|
+
else:
|
198
|
+
# Call the build method directly if it's sync
|
199
|
+
build_result = custom_component.build(**params)
|
200
|
+
custom_repr = custom_component.custom_repr()
|
201
|
+
if custom_repr is None and isinstance(build_result, dict | Data | str):
|
202
|
+
custom_repr = build_result
|
203
|
+
if not isinstance(custom_repr, str):
|
204
|
+
custom_repr = str(custom_repr)
|
205
|
+
raw = custom_component.repr_value
|
206
|
+
if hasattr(raw, "data") and raw is not None:
|
207
|
+
raw = raw.data
|
208
|
+
|
209
|
+
elif hasattr(raw, "model_dump") and raw is not None:
|
210
|
+
raw = raw.model_dump()
|
211
|
+
if raw is None and isinstance(build_result, dict | Data | str):
|
212
|
+
raw = build_result.data if isinstance(build_result, Data) else build_result
|
213
|
+
|
214
|
+
artifact_type = get_artifact_type(custom_component.repr_value or raw, build_result)
|
215
|
+
raw = post_process_raw(raw, artifact_type)
|
216
|
+
artifact = {"repr": custom_repr, "raw": raw, "type": artifact_type}
|
217
|
+
|
218
|
+
if custom_component.get_vertex() is not None:
|
219
|
+
custom_component.set_artifacts({custom_component.get_vertex().outputs[0].get("name"): artifact})
|
220
|
+
custom_component.set_results({custom_component.get_vertex().outputs[0].get("name"): build_result})
|
221
|
+
return custom_component, build_result, artifact
|
222
|
+
|
223
|
+
msg = "Custom component does not have a vertex"
|
224
|
+
raise ValueError(msg)
|
lfx/interface/listing.py
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
from typing_extensions import override
|
2
|
+
|
3
|
+
from lfx.services.deps import get_settings_service
|
4
|
+
from lfx.utils.lazy_load import LazyLoadDictBase
|
5
|
+
|
6
|
+
|
7
|
+
class AllTypesDict(LazyLoadDictBase):
|
8
|
+
def __init__(self) -> None:
|
9
|
+
self._all_types_dict = None
|
10
|
+
|
11
|
+
def _build_dict(self):
|
12
|
+
langchain_types_dict = self.get_type_dict()
|
13
|
+
return {
|
14
|
+
**langchain_types_dict,
|
15
|
+
"Custom": ["Custom Tool", "Python Function"],
|
16
|
+
}
|
17
|
+
|
18
|
+
@override
|
19
|
+
def get_type_dict(self):
|
20
|
+
from lfx.custom.utils import get_all_types_dict
|
21
|
+
|
22
|
+
settings_service = get_settings_service()
|
23
|
+
return get_all_types_dict(settings_service.settings.components_path)
|
24
|
+
|
25
|
+
|
26
|
+
lazy_load_dict = AllTypesDict()
|
lfx/interface/run.py
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
def get_memory_key(langchain_object):
|
2
|
+
"""Get the memory key from the LangChain object's memory attribute.
|
3
|
+
|
4
|
+
Given a LangChain object, this function retrieves the current memory key from the object's memory attribute.
|
5
|
+
It then checks if the key exists in a dictionary of known memory keys and returns the corresponding key,
|
6
|
+
or None if the current key is not recognized.
|
7
|
+
"""
|
8
|
+
mem_key_dict = {
|
9
|
+
"chat_history": "history",
|
10
|
+
"history": "chat_history",
|
11
|
+
}
|
12
|
+
# Check if memory_key attribute exists
|
13
|
+
if hasattr(langchain_object.memory, "memory_key"):
|
14
|
+
memory_key = langchain_object.memory.memory_key
|
15
|
+
return mem_key_dict.get(memory_key)
|
16
|
+
return None # or some other default value or action
|
lfx/interface/utils.py
ADDED
@@ -0,0 +1,111 @@
|
|
1
|
+
import base64
|
2
|
+
import json
|
3
|
+
import os
|
4
|
+
from io import BytesIO
|
5
|
+
from pathlib import Path
|
6
|
+
from string import Formatter
|
7
|
+
|
8
|
+
import yaml
|
9
|
+
from langchain_core.language_models import BaseLanguageModel
|
10
|
+
from PIL.Image import Image
|
11
|
+
|
12
|
+
from lfx.log.logger import logger
|
13
|
+
from lfx.services.chat.config import ChatConfig
|
14
|
+
from lfx.services.deps import get_settings_service
|
15
|
+
|
16
|
+
|
17
|
+
def load_file_into_dict(file_path: str) -> dict:
|
18
|
+
file_path_ = Path(file_path)
|
19
|
+
if not file_path_.exists():
|
20
|
+
msg = f"File not found: {file_path}"
|
21
|
+
raise FileNotFoundError(msg)
|
22
|
+
|
23
|
+
# Files names are UUID, so we can't find the extension
|
24
|
+
with file_path_.open(encoding="utf-8") as file:
|
25
|
+
try:
|
26
|
+
data = json.load(file)
|
27
|
+
except json.JSONDecodeError:
|
28
|
+
file.seek(0)
|
29
|
+
data = yaml.safe_load(file)
|
30
|
+
except ValueError as exc:
|
31
|
+
msg = "Invalid file type. Expected .json or .yaml."
|
32
|
+
raise ValueError(msg) from exc
|
33
|
+
return data
|
34
|
+
|
35
|
+
|
36
|
+
def pil_to_base64(image: Image) -> str:
|
37
|
+
buffered = BytesIO()
|
38
|
+
image.save(buffered, format="PNG")
|
39
|
+
img_str = base64.b64encode(buffered.getvalue())
|
40
|
+
return img_str.decode("utf-8")
|
41
|
+
|
42
|
+
|
43
|
+
def try_setting_streaming_options(langchain_object):
|
44
|
+
"""Try setting streaming options on LangChain objects."""
|
45
|
+
# If the LLM type is OpenAI or ChatOpenAI, set streaming to True
|
46
|
+
# First we need to find the LLM
|
47
|
+
llm = None
|
48
|
+
if hasattr(langchain_object, "llm"):
|
49
|
+
llm = langchain_object.llm
|
50
|
+
elif hasattr(langchain_object, "llm_chain") and hasattr(langchain_object.llm_chain, "llm"):
|
51
|
+
llm = langchain_object.llm_chain.llm
|
52
|
+
|
53
|
+
if isinstance(llm, BaseLanguageModel):
|
54
|
+
if hasattr(llm, "streaming") and isinstance(llm.streaming, bool):
|
55
|
+
llm.streaming = ChatConfig.streaming
|
56
|
+
elif hasattr(llm, "stream") and isinstance(llm.stream, bool):
|
57
|
+
llm.stream = ChatConfig.streaming
|
58
|
+
|
59
|
+
return langchain_object
|
60
|
+
|
61
|
+
|
62
|
+
def extract_input_variables_from_prompt(prompt: str) -> list[str]:
|
63
|
+
"""Extract variable names from a prompt string using Python's built-in string formatter.
|
64
|
+
|
65
|
+
Uses the same convention as Python's .format() method:
|
66
|
+
- Single braces {name} are variable placeholders
|
67
|
+
- Double braces {{name}} are escape sequences that render as literal {name}
|
68
|
+
"""
|
69
|
+
formatter = Formatter()
|
70
|
+
variables: list[str] = []
|
71
|
+
seen: set[str] = set()
|
72
|
+
|
73
|
+
# Use local bindings for micro-optimization
|
74
|
+
variables_append = variables.append
|
75
|
+
seen_add = seen.add
|
76
|
+
seen_contains = seen.__contains__
|
77
|
+
|
78
|
+
for _, field_name, _, _ in formatter.parse(prompt):
|
79
|
+
if field_name and not seen_contains(field_name):
|
80
|
+
variables_append(field_name)
|
81
|
+
seen_add(field_name)
|
82
|
+
|
83
|
+
return variables
|
84
|
+
|
85
|
+
|
86
|
+
def setup_llm_caching() -> None:
|
87
|
+
"""Setup LLM caching."""
|
88
|
+
settings_service = get_settings_service()
|
89
|
+
try:
|
90
|
+
set_langchain_cache(settings_service.settings)
|
91
|
+
except ImportError:
|
92
|
+
logger.warning(f"Could not import {settings_service.settings.cache_type}. ")
|
93
|
+
except Exception: # noqa: BLE001
|
94
|
+
logger.warning("Could not setup LLM caching.")
|
95
|
+
|
96
|
+
|
97
|
+
def set_langchain_cache(settings) -> None:
|
98
|
+
from langchain.globals import set_llm_cache
|
99
|
+
from langflow.interface.importing.utils import import_class
|
100
|
+
|
101
|
+
if cache_type := os.getenv("LANGFLOW_LANGCHAIN_CACHE"):
|
102
|
+
try:
|
103
|
+
cache_class = import_class(f"langchain_community.cache.{cache_type or settings.LANGCHAIN_CACHE}")
|
104
|
+
|
105
|
+
logger.debug(f"Setting up LLM caching with {cache_class.__name__}")
|
106
|
+
set_llm_cache(cache_class())
|
107
|
+
logger.info(f"LLM caching setup with {cache_class.__name__}")
|
108
|
+
except ImportError:
|
109
|
+
logger.warning(f"Could not import {cache_type}. ")
|
110
|
+
else:
|
111
|
+
logger.debug("No LLM cache set.")
|
lfx/io/__init__.py
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
from lfx.inputs import (
|
2
|
+
BoolInput,
|
3
|
+
CodeInput,
|
4
|
+
DataFrameInput,
|
5
|
+
DataInput,
|
6
|
+
DefaultPromptField,
|
7
|
+
DictInput,
|
8
|
+
DropdownInput,
|
9
|
+
FileInput,
|
10
|
+
FloatInput,
|
11
|
+
HandleInput,
|
12
|
+
IntInput,
|
13
|
+
LinkInput,
|
14
|
+
McpInput,
|
15
|
+
MessageInput,
|
16
|
+
MessageTextInput,
|
17
|
+
MultilineInput,
|
18
|
+
MultilineSecretInput,
|
19
|
+
MultiselectInput,
|
20
|
+
NestedDictInput,
|
21
|
+
PromptInput,
|
22
|
+
QueryInput,
|
23
|
+
SecretStrInput,
|
24
|
+
SliderInput,
|
25
|
+
StrInput,
|
26
|
+
TabInput,
|
27
|
+
TableInput,
|
28
|
+
ToolsInput,
|
29
|
+
)
|
30
|
+
from lfx.template import Output
|
31
|
+
|
32
|
+
__all__ = [
|
33
|
+
"BoolInput",
|
34
|
+
"CodeInput",
|
35
|
+
"DataFrameInput",
|
36
|
+
"DataInput",
|
37
|
+
"DefaultPromptField",
|
38
|
+
"DefaultPromptField",
|
39
|
+
"DictInput",
|
40
|
+
"DropdownInput",
|
41
|
+
"FileInput",
|
42
|
+
"FloatInput",
|
43
|
+
"HandleInput",
|
44
|
+
"IntInput",
|
45
|
+
"LinkInput",
|
46
|
+
"LinkInput",
|
47
|
+
"McpInput",
|
48
|
+
"MessageInput",
|
49
|
+
"MessageTextInput",
|
50
|
+
"MultilineInput",
|
51
|
+
"MultilineSecretInput",
|
52
|
+
"MultiselectInput",
|
53
|
+
"NestedDictInput",
|
54
|
+
"Output",
|
55
|
+
"PromptInput",
|
56
|
+
"QueryInput",
|
57
|
+
"SecretStrInput",
|
58
|
+
"SliderInput",
|
59
|
+
"StrInput",
|
60
|
+
"TabInput",
|
61
|
+
"TableInput",
|
62
|
+
"ToolsInput",
|
63
|
+
]
|