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/custom/validate.py
ADDED
@@ -0,0 +1,488 @@
|
|
1
|
+
import ast
|
2
|
+
import contextlib
|
3
|
+
import importlib
|
4
|
+
import warnings
|
5
|
+
from types import FunctionType
|
6
|
+
from typing import Optional, Union
|
7
|
+
|
8
|
+
from langchain_core._api.deprecation import LangChainDeprecationWarning
|
9
|
+
from pydantic import ValidationError
|
10
|
+
|
11
|
+
from lfx.field_typing.constants import CUSTOM_COMPONENT_SUPPORTED_TYPES, DEFAULT_IMPORT_STRING
|
12
|
+
from lfx.log.logger import logger
|
13
|
+
|
14
|
+
_LANGFLOW_IS_INSTALLED = False
|
15
|
+
|
16
|
+
with contextlib.suppress(ImportError):
|
17
|
+
import langflow # noqa: F401
|
18
|
+
|
19
|
+
_LANGFLOW_IS_INSTALLED = True
|
20
|
+
|
21
|
+
|
22
|
+
def add_type_ignores() -> None:
|
23
|
+
if not hasattr(ast, "TypeIgnore"):
|
24
|
+
|
25
|
+
class TypeIgnore(ast.AST):
|
26
|
+
_fields = ()
|
27
|
+
|
28
|
+
ast.TypeIgnore = TypeIgnore # type: ignore[assignment, misc]
|
29
|
+
|
30
|
+
|
31
|
+
def validate_code(code):
|
32
|
+
# Initialize the errors dictionary
|
33
|
+
errors = {"imports": {"errors": []}, "function": {"errors": []}}
|
34
|
+
|
35
|
+
# Parse the code string into an abstract syntax tree (AST)
|
36
|
+
try:
|
37
|
+
tree = ast.parse(code)
|
38
|
+
except Exception as e: # noqa: BLE001
|
39
|
+
if hasattr(logger, "opt"):
|
40
|
+
logger.debug("Error parsing code", exc_info=True)
|
41
|
+
else:
|
42
|
+
logger.debug("Error parsing code")
|
43
|
+
errors["function"]["errors"].append(str(e))
|
44
|
+
return errors
|
45
|
+
|
46
|
+
# Add a dummy type_ignores field to the AST
|
47
|
+
add_type_ignores()
|
48
|
+
tree.type_ignores = []
|
49
|
+
|
50
|
+
# Evaluate the import statements
|
51
|
+
for node in tree.body:
|
52
|
+
if isinstance(node, ast.Import):
|
53
|
+
for alias in node.names:
|
54
|
+
try:
|
55
|
+
importlib.import_module(alias.name)
|
56
|
+
except ModuleNotFoundError as e:
|
57
|
+
errors["imports"]["errors"].append(str(e))
|
58
|
+
|
59
|
+
# Evaluate the function definition with langflow context
|
60
|
+
for node in tree.body:
|
61
|
+
if isinstance(node, ast.FunctionDef):
|
62
|
+
code_obj = compile(ast.Module(body=[node], type_ignores=[]), "<string>", "exec")
|
63
|
+
try:
|
64
|
+
# Create execution context with common langflow imports
|
65
|
+
exec_globals = _create_langflow_execution_context()
|
66
|
+
exec(code_obj, exec_globals)
|
67
|
+
except Exception as e: # noqa: BLE001
|
68
|
+
logger.debug("Error executing function code", exc_info=True)
|
69
|
+
errors["function"]["errors"].append(str(e))
|
70
|
+
|
71
|
+
# Return the errors dictionary
|
72
|
+
return errors
|
73
|
+
|
74
|
+
|
75
|
+
def _create_langflow_execution_context():
|
76
|
+
"""Create execution context with common langflow imports."""
|
77
|
+
context = {}
|
78
|
+
|
79
|
+
# Import common langflow types that are used in templates
|
80
|
+
try:
|
81
|
+
from lfx.schema.dataframe import DataFrame
|
82
|
+
|
83
|
+
context["DataFrame"] = DataFrame
|
84
|
+
except ImportError:
|
85
|
+
# Create a mock DataFrame if import fails
|
86
|
+
context["DataFrame"] = type("DataFrame", (), {})
|
87
|
+
|
88
|
+
try:
|
89
|
+
from lfx.schema.message import Message
|
90
|
+
|
91
|
+
context["Message"] = Message
|
92
|
+
except ImportError:
|
93
|
+
context["Message"] = type("Message", (), {})
|
94
|
+
|
95
|
+
try:
|
96
|
+
from lfx.schema.data import Data
|
97
|
+
|
98
|
+
context["Data"] = Data
|
99
|
+
except ImportError:
|
100
|
+
context["Data"] = type("Data", (), {})
|
101
|
+
|
102
|
+
try:
|
103
|
+
from lfx.custom import Component
|
104
|
+
|
105
|
+
context["Component"] = Component
|
106
|
+
except ImportError:
|
107
|
+
context["Component"] = type("Component", (), {})
|
108
|
+
|
109
|
+
try:
|
110
|
+
from lfx.io import HandleInput, Output, TabInput
|
111
|
+
|
112
|
+
context["HandleInput"] = HandleInput
|
113
|
+
context["Output"] = Output
|
114
|
+
context["TabInput"] = TabInput
|
115
|
+
except ImportError:
|
116
|
+
context["HandleInput"] = type("HandleInput", (), {})
|
117
|
+
context["Output"] = type("Output", (), {})
|
118
|
+
context["TabInput"] = type("TabInput", (), {})
|
119
|
+
|
120
|
+
# Add common Python typing imports
|
121
|
+
try:
|
122
|
+
from typing import Any, Optional, Union
|
123
|
+
|
124
|
+
context["Any"] = Any
|
125
|
+
context["Dict"] = dict
|
126
|
+
context["List"] = list
|
127
|
+
context["Optional"] = Optional
|
128
|
+
context["Union"] = Union
|
129
|
+
except ImportError:
|
130
|
+
pass
|
131
|
+
|
132
|
+
return context
|
133
|
+
|
134
|
+
|
135
|
+
def eval_function(function_string: str):
|
136
|
+
# Create an empty dictionary to serve as a separate namespace
|
137
|
+
namespace: dict = {}
|
138
|
+
|
139
|
+
# Execute the code string in the new namespace
|
140
|
+
exec(function_string, namespace)
|
141
|
+
function_object = next(
|
142
|
+
(
|
143
|
+
obj
|
144
|
+
for name, obj in namespace.items()
|
145
|
+
if isinstance(obj, FunctionType) and obj.__code__.co_filename == "<string>"
|
146
|
+
),
|
147
|
+
None,
|
148
|
+
)
|
149
|
+
if function_object is None:
|
150
|
+
msg = "Function string does not contain a function"
|
151
|
+
raise ValueError(msg)
|
152
|
+
return function_object
|
153
|
+
|
154
|
+
|
155
|
+
def execute_function(code, function_name, *args, **kwargs):
|
156
|
+
add_type_ignores()
|
157
|
+
|
158
|
+
module = ast.parse(code)
|
159
|
+
exec_globals = globals().copy()
|
160
|
+
|
161
|
+
for node in module.body:
|
162
|
+
if isinstance(node, ast.Import):
|
163
|
+
for alias in node.names:
|
164
|
+
try:
|
165
|
+
exec(
|
166
|
+
f"{alias.asname or alias.name} = importlib.import_module('{alias.name}')",
|
167
|
+
exec_globals,
|
168
|
+
locals(),
|
169
|
+
)
|
170
|
+
exec_globals[alias.asname or alias.name] = importlib.import_module(alias.name)
|
171
|
+
except ModuleNotFoundError as e:
|
172
|
+
msg = f"Module {alias.name} not found. Please install it and try again."
|
173
|
+
raise ModuleNotFoundError(msg) from e
|
174
|
+
|
175
|
+
function_code = next(
|
176
|
+
node for node in module.body if isinstance(node, ast.FunctionDef) and node.name == function_name
|
177
|
+
)
|
178
|
+
function_code.parent = None
|
179
|
+
code_obj = compile(ast.Module(body=[function_code], type_ignores=[]), "<string>", "exec")
|
180
|
+
exec_locals = dict(locals())
|
181
|
+
try:
|
182
|
+
exec(code_obj, exec_globals, exec_locals)
|
183
|
+
except Exception as exc:
|
184
|
+
msg = "Function string does not contain a function"
|
185
|
+
raise ValueError(msg) from exc
|
186
|
+
|
187
|
+
# Add the function to the exec_globals dictionary
|
188
|
+
exec_globals[function_name] = exec_locals[function_name]
|
189
|
+
|
190
|
+
return exec_globals[function_name](*args, **kwargs)
|
191
|
+
|
192
|
+
|
193
|
+
def create_function(code, function_name):
|
194
|
+
if not hasattr(ast, "TypeIgnore"):
|
195
|
+
|
196
|
+
class TypeIgnore(ast.AST):
|
197
|
+
_fields = ()
|
198
|
+
|
199
|
+
ast.TypeIgnore = TypeIgnore
|
200
|
+
|
201
|
+
module = ast.parse(code)
|
202
|
+
exec_globals = globals().copy()
|
203
|
+
|
204
|
+
for node in module.body:
|
205
|
+
if isinstance(node, ast.Import | ast.ImportFrom):
|
206
|
+
for alias in node.names:
|
207
|
+
try:
|
208
|
+
if isinstance(node, ast.ImportFrom):
|
209
|
+
module_name = node.module
|
210
|
+
exec_globals[alias.asname or alias.name] = getattr(
|
211
|
+
importlib.import_module(module_name), alias.name
|
212
|
+
)
|
213
|
+
else:
|
214
|
+
module_name = alias.name
|
215
|
+
exec_globals[alias.asname or alias.name] = importlib.import_module(module_name)
|
216
|
+
except ModuleNotFoundError as e:
|
217
|
+
msg = f"Module {alias.name} not found. Please install it and try again."
|
218
|
+
raise ModuleNotFoundError(msg) from e
|
219
|
+
|
220
|
+
function_code = next(
|
221
|
+
node for node in module.body if isinstance(node, ast.FunctionDef) and node.name == function_name
|
222
|
+
)
|
223
|
+
function_code.parent = None
|
224
|
+
code_obj = compile(ast.Module(body=[function_code], type_ignores=[]), "<string>", "exec")
|
225
|
+
exec_locals = dict(locals())
|
226
|
+
with contextlib.suppress(Exception):
|
227
|
+
exec(code_obj, exec_globals, exec_locals)
|
228
|
+
exec_globals[function_name] = exec_locals[function_name]
|
229
|
+
|
230
|
+
# Return a function that imports necessary modules and calls the target function
|
231
|
+
def wrapped_function(*args, **kwargs):
|
232
|
+
for module_name, module in exec_globals.items():
|
233
|
+
if isinstance(module, type(importlib)):
|
234
|
+
globals()[module_name] = module
|
235
|
+
|
236
|
+
return exec_globals[function_name](*args, **kwargs)
|
237
|
+
|
238
|
+
return wrapped_function
|
239
|
+
|
240
|
+
|
241
|
+
def create_class(code, class_name):
|
242
|
+
"""Dynamically create a class from a string of code and a specified class name.
|
243
|
+
|
244
|
+
Args:
|
245
|
+
code: String containing the Python code defining the class
|
246
|
+
class_name: Name of the class to be created
|
247
|
+
|
248
|
+
Returns:
|
249
|
+
A function that, when called, returns an instance of the created class
|
250
|
+
|
251
|
+
Raises:
|
252
|
+
ValueError: If the code contains syntax errors or the class definition is invalid
|
253
|
+
"""
|
254
|
+
if not hasattr(ast, "TypeIgnore"):
|
255
|
+
ast.TypeIgnore = create_type_ignore_class()
|
256
|
+
|
257
|
+
code = code.replace("from langflow import CustomComponent", "from langflow.custom import CustomComponent")
|
258
|
+
code = code.replace(
|
259
|
+
"from langflow.interface.custom.custom_component import CustomComponent",
|
260
|
+
"from langflow.custom import CustomComponent",
|
261
|
+
)
|
262
|
+
|
263
|
+
code = DEFAULT_IMPORT_STRING + "\n" + code
|
264
|
+
try:
|
265
|
+
module = ast.parse(code)
|
266
|
+
exec_globals = prepare_global_scope(module)
|
267
|
+
|
268
|
+
class_code = extract_class_code(module, class_name)
|
269
|
+
compiled_class = compile_class_code(class_code)
|
270
|
+
|
271
|
+
return build_class_constructor(compiled_class, exec_globals, class_name)
|
272
|
+
|
273
|
+
except SyntaxError as e:
|
274
|
+
msg = f"Syntax error in code: {e!s}"
|
275
|
+
raise ValueError(msg) from e
|
276
|
+
except NameError as e:
|
277
|
+
msg = f"Name error (possibly undefined variable): {e!s}"
|
278
|
+
raise ValueError(msg) from e
|
279
|
+
except ValidationError as e:
|
280
|
+
messages = [error["msg"].split(",", 1) for error in e.errors()]
|
281
|
+
error_message = "\n".join([message[1] if len(message) > 1 else message[0] for message in messages])
|
282
|
+
raise ValueError(error_message) from e
|
283
|
+
except Exception as e:
|
284
|
+
msg = f"Error creating class: {e!s}"
|
285
|
+
raise ValueError(msg) from e
|
286
|
+
|
287
|
+
|
288
|
+
def create_type_ignore_class():
|
289
|
+
"""Create a TypeIgnore class for AST module if it doesn't exist.
|
290
|
+
|
291
|
+
Returns:
|
292
|
+
TypeIgnore class
|
293
|
+
"""
|
294
|
+
|
295
|
+
class TypeIgnore(ast.AST):
|
296
|
+
_fields = ()
|
297
|
+
|
298
|
+
return TypeIgnore
|
299
|
+
|
300
|
+
|
301
|
+
def prepare_global_scope(module):
|
302
|
+
"""Prepares the global scope with necessary imports from the provided code module.
|
303
|
+
|
304
|
+
Args:
|
305
|
+
module: AST parsed module
|
306
|
+
|
307
|
+
Returns:
|
308
|
+
Dictionary representing the global scope with imported modules
|
309
|
+
|
310
|
+
Raises:
|
311
|
+
ModuleNotFoundError: If a module is not found in the code
|
312
|
+
"""
|
313
|
+
exec_globals = globals().copy()
|
314
|
+
imports = []
|
315
|
+
import_froms = []
|
316
|
+
definitions = []
|
317
|
+
|
318
|
+
for node in module.body:
|
319
|
+
if isinstance(node, ast.Import):
|
320
|
+
imports.append(node)
|
321
|
+
elif isinstance(node, ast.ImportFrom) and node.module is not None:
|
322
|
+
import_froms.append(node)
|
323
|
+
elif isinstance(node, ast.ClassDef | ast.FunctionDef | ast.Assign):
|
324
|
+
definitions.append(node)
|
325
|
+
|
326
|
+
for node in imports:
|
327
|
+
for alias in node.names:
|
328
|
+
try:
|
329
|
+
module_name = alias.name
|
330
|
+
variable_name = alias.asname or alias.name
|
331
|
+
exec_globals[variable_name] = importlib.import_module(module_name)
|
332
|
+
except ModuleNotFoundError as e:
|
333
|
+
msg = f"Module {alias.name} not found. Please install it and try again."
|
334
|
+
raise ModuleNotFoundError(msg) from e
|
335
|
+
|
336
|
+
for node in import_froms:
|
337
|
+
try:
|
338
|
+
module_name = node.module
|
339
|
+
# Apply warning suppression only when needed
|
340
|
+
if "langchain" in module_name:
|
341
|
+
with warnings.catch_warnings():
|
342
|
+
warnings.simplefilter("ignore", LangChainDeprecationWarning)
|
343
|
+
imported_module = importlib.import_module(module_name)
|
344
|
+
else:
|
345
|
+
imported_module = importlib.import_module(module_name)
|
346
|
+
|
347
|
+
for alias in node.names:
|
348
|
+
try:
|
349
|
+
# First try getting it as an attribute
|
350
|
+
exec_globals[alias.name] = getattr(imported_module, alias.name)
|
351
|
+
except AttributeError:
|
352
|
+
# If that fails, try importing the full module path
|
353
|
+
full_module_path = f"{module_name}.{alias.name}"
|
354
|
+
exec_globals[alias.name] = importlib.import_module(full_module_path)
|
355
|
+
except ModuleNotFoundError as e:
|
356
|
+
msg = f"Module {node.module} not found. Please install it and try again"
|
357
|
+
raise ModuleNotFoundError(msg) from e
|
358
|
+
|
359
|
+
if definitions:
|
360
|
+
combined_module = ast.Module(body=definitions, type_ignores=[])
|
361
|
+
compiled_code = compile(combined_module, "<string>", "exec")
|
362
|
+
exec(compiled_code, exec_globals)
|
363
|
+
|
364
|
+
return exec_globals
|
365
|
+
|
366
|
+
|
367
|
+
def extract_class_code(module, class_name):
|
368
|
+
"""Extracts the AST node for the specified class from the module.
|
369
|
+
|
370
|
+
Args:
|
371
|
+
module: AST parsed module
|
372
|
+
class_name: Name of the class to extract
|
373
|
+
|
374
|
+
Returns:
|
375
|
+
AST node of the specified class
|
376
|
+
"""
|
377
|
+
class_code = next(node for node in module.body if isinstance(node, ast.ClassDef) and node.name == class_name)
|
378
|
+
|
379
|
+
class_code.parent = None
|
380
|
+
return class_code
|
381
|
+
|
382
|
+
|
383
|
+
def compile_class_code(class_code):
|
384
|
+
"""Compiles the AST node of a class into a code object.
|
385
|
+
|
386
|
+
Args:
|
387
|
+
class_code: AST node of the class
|
388
|
+
|
389
|
+
Returns:
|
390
|
+
Compiled code object of the class
|
391
|
+
"""
|
392
|
+
return compile(ast.Module(body=[class_code], type_ignores=[]), "<string>", "exec")
|
393
|
+
|
394
|
+
|
395
|
+
def build_class_constructor(compiled_class, exec_globals, class_name):
|
396
|
+
"""Builds a constructor function for the dynamically created class.
|
397
|
+
|
398
|
+
Args:
|
399
|
+
compiled_class: Compiled code object of the class
|
400
|
+
exec_globals: Global scope with necessary imports
|
401
|
+
class_name: Name of the class
|
402
|
+
|
403
|
+
Returns:
|
404
|
+
Constructor function for the class
|
405
|
+
"""
|
406
|
+
exec_locals = dict(locals())
|
407
|
+
exec(compiled_class, exec_globals, exec_locals)
|
408
|
+
exec_globals[class_name] = exec_locals[class_name]
|
409
|
+
|
410
|
+
# Return a function that imports necessary modules and creates an instance of the target class
|
411
|
+
def build_custom_class():
|
412
|
+
for module_name, module in exec_globals.items():
|
413
|
+
if isinstance(module, type(importlib)):
|
414
|
+
globals()[module_name] = module
|
415
|
+
|
416
|
+
return exec_globals[class_name]
|
417
|
+
|
418
|
+
return build_custom_class()
|
419
|
+
|
420
|
+
|
421
|
+
# TODO: Remove this function
|
422
|
+
def get_default_imports(code_string):
|
423
|
+
"""Returns a dictionary of default imports for the dynamic class constructor."""
|
424
|
+
default_imports = {
|
425
|
+
"Optional": Optional,
|
426
|
+
"List": list,
|
427
|
+
"Dict": dict,
|
428
|
+
"Union": Union,
|
429
|
+
}
|
430
|
+
langflow_imports = list(CUSTOM_COMPONENT_SUPPORTED_TYPES.keys())
|
431
|
+
necessary_imports = find_names_in_code(code_string, langflow_imports)
|
432
|
+
langflow_module = importlib.import_module("lfx.field_typing")
|
433
|
+
default_imports.update({name: getattr(langflow_module, name) for name in necessary_imports})
|
434
|
+
|
435
|
+
return default_imports
|
436
|
+
|
437
|
+
|
438
|
+
def find_names_in_code(code, names):
|
439
|
+
"""Finds if any of the specified names are present in the given code string.
|
440
|
+
|
441
|
+
Args:
|
442
|
+
code: The source code as a string.
|
443
|
+
names: A list of names to check for in the code.
|
444
|
+
|
445
|
+
Returns:
|
446
|
+
A set of names that are found in the code.
|
447
|
+
"""
|
448
|
+
return {name for name in names if name in code}
|
449
|
+
|
450
|
+
|
451
|
+
def extract_function_name(code):
|
452
|
+
module = ast.parse(code)
|
453
|
+
for node in module.body:
|
454
|
+
if isinstance(node, ast.FunctionDef):
|
455
|
+
return node.name
|
456
|
+
msg = "No function definition found in the code string"
|
457
|
+
raise ValueError(msg)
|
458
|
+
|
459
|
+
|
460
|
+
def extract_class_name(code: str) -> str:
|
461
|
+
"""Extract the name of the first Component subclass found in the code.
|
462
|
+
|
463
|
+
Args:
|
464
|
+
code (str): The source code to parse
|
465
|
+
|
466
|
+
Returns:
|
467
|
+
str: Name of the first Component subclass found
|
468
|
+
|
469
|
+
Raises:
|
470
|
+
TypeError: If no Component subclass is found in the code
|
471
|
+
"""
|
472
|
+
try:
|
473
|
+
module = ast.parse(code)
|
474
|
+
for node in module.body:
|
475
|
+
if not isinstance(node, ast.ClassDef):
|
476
|
+
continue
|
477
|
+
|
478
|
+
# Check bases for Component inheritance
|
479
|
+
# TODO: Build a more robust check for Component inheritance
|
480
|
+
for base in node.bases:
|
481
|
+
if isinstance(base, ast.Name) and any(pattern in base.id for pattern in ["Component", "LC"]):
|
482
|
+
return node.name
|
483
|
+
|
484
|
+
msg = f"No Component subclass found in the code string. Code snippet: {code[:100]}"
|
485
|
+
raise TypeError(msg)
|
486
|
+
except SyntaxError as e:
|
487
|
+
msg = f"Invalid Python code: {e!s}"
|
488
|
+
raise ValueError(msg) from e
|
lfx/events/__init__.py
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
# Event management for lfx package
|
@@ -0,0 +1,110 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import inspect
|
4
|
+
import json
|
5
|
+
import time
|
6
|
+
import uuid
|
7
|
+
from functools import partial
|
8
|
+
from typing import TYPE_CHECKING
|
9
|
+
|
10
|
+
from fastapi.encoders import jsonable_encoder
|
11
|
+
from typing_extensions import Protocol
|
12
|
+
|
13
|
+
from lfx.log.logger import logger
|
14
|
+
|
15
|
+
if TYPE_CHECKING:
|
16
|
+
# Lightweight type stub for log types
|
17
|
+
LoggableType = dict | str | int | float | bool | list | None
|
18
|
+
|
19
|
+
|
20
|
+
class EventCallback(Protocol):
|
21
|
+
def __call__(self, *, manager: EventManager, event_type: str, data: LoggableType): ...
|
22
|
+
|
23
|
+
|
24
|
+
class PartialEventCallback(Protocol):
|
25
|
+
def __call__(self, *, data: LoggableType): ...
|
26
|
+
|
27
|
+
|
28
|
+
class EventManager:
|
29
|
+
def __init__(self, queue):
|
30
|
+
self.queue = queue
|
31
|
+
self.events: dict[str, PartialEventCallback] = {}
|
32
|
+
|
33
|
+
@staticmethod
|
34
|
+
def _validate_callback(callback: EventCallback) -> None:
|
35
|
+
if not callable(callback):
|
36
|
+
msg = "Callback must be callable"
|
37
|
+
raise TypeError(msg)
|
38
|
+
# Check if it has `self, event_type and data`
|
39
|
+
sig = inspect.signature(callback)
|
40
|
+
parameters = ["manager", "event_type", "data"]
|
41
|
+
if len(sig.parameters) != len(parameters):
|
42
|
+
msg = "Callback must have exactly 3 parameters"
|
43
|
+
raise ValueError(msg)
|
44
|
+
if not all(param.name in parameters for param in sig.parameters.values()):
|
45
|
+
msg = "Callback must have exactly 3 parameters: manager, event_type, and data"
|
46
|
+
raise ValueError(msg)
|
47
|
+
|
48
|
+
def register_event(
|
49
|
+
self,
|
50
|
+
name: str,
|
51
|
+
event_type: str,
|
52
|
+
callback: EventCallback | None = None,
|
53
|
+
) -> None:
|
54
|
+
if not name:
|
55
|
+
msg = "Event name cannot be empty"
|
56
|
+
raise ValueError(msg)
|
57
|
+
if not name.startswith("on_"):
|
58
|
+
msg = "Event name must start with 'on_'"
|
59
|
+
raise ValueError(msg)
|
60
|
+
if callback is None:
|
61
|
+
callback_ = partial(self.send_event, event_type=event_type)
|
62
|
+
else:
|
63
|
+
callback_ = partial(callback, manager=self, event_type=event_type)
|
64
|
+
self.events[name] = callback_
|
65
|
+
|
66
|
+
def send_event(self, *, event_type: str, data: LoggableType):
|
67
|
+
try:
|
68
|
+
# Simple event creation without heavy dependencies
|
69
|
+
if isinstance(data, dict) and event_type in {"message", "error", "warning", "info", "token"}:
|
70
|
+
# For lfx, keep it simple without playground event creation
|
71
|
+
pass
|
72
|
+
except Exception: # noqa: BLE001
|
73
|
+
logger.debug(f"Error processing event: {event_type}")
|
74
|
+
jsonable_data = jsonable_encoder(data)
|
75
|
+
json_data = {"event": event_type, "data": jsonable_data}
|
76
|
+
event_id = f"{event_type}-{uuid.uuid4()}"
|
77
|
+
str_data = json.dumps(json_data) + "\n\n"
|
78
|
+
if self.queue:
|
79
|
+
try:
|
80
|
+
self.queue.put_nowait((event_id, str_data.encode("utf-8"), time.time()))
|
81
|
+
except Exception: # noqa: BLE001
|
82
|
+
logger.debug("Queue not available for event")
|
83
|
+
|
84
|
+
def noop(self, *, data: LoggableType) -> None:
|
85
|
+
pass
|
86
|
+
|
87
|
+
def __getattr__(self, name: str) -> PartialEventCallback:
|
88
|
+
return self.events.get(name, self.noop)
|
89
|
+
|
90
|
+
|
91
|
+
def create_default_event_manager(queue=None):
|
92
|
+
manager = EventManager(queue)
|
93
|
+
manager.register_event("on_token", "token")
|
94
|
+
manager.register_event("on_vertices_sorted", "vertices_sorted")
|
95
|
+
manager.register_event("on_error", "error")
|
96
|
+
manager.register_event("on_end", "end")
|
97
|
+
manager.register_event("on_message", "add_message")
|
98
|
+
manager.register_event("on_remove_message", "remove_message")
|
99
|
+
manager.register_event("on_end_vertex", "end_vertex")
|
100
|
+
manager.register_event("on_build_start", "build_start")
|
101
|
+
manager.register_event("on_build_end", "build_end")
|
102
|
+
return manager
|
103
|
+
|
104
|
+
|
105
|
+
def create_stream_tokens_event_manager(queue=None):
|
106
|
+
manager = EventManager(queue)
|
107
|
+
manager.register_event("on_message", "add_message")
|
108
|
+
manager.register_event("on_token", "token")
|
109
|
+
manager.register_event("on_end", "end")
|
110
|
+
return manager
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
from lfx.schema.properties import Source
|
2
|
+
|
3
|
+
|
4
|
+
class ComponentBuildError(Exception):
|
5
|
+
def __init__(self, message: str, formatted_traceback: str):
|
6
|
+
self.message = message
|
7
|
+
self.formatted_traceback = formatted_traceback
|
8
|
+
super().__init__(message)
|
9
|
+
|
10
|
+
|
11
|
+
class StreamingError(Exception):
|
12
|
+
def __init__(self, cause: Exception, source: Source):
|
13
|
+
self.cause = cause
|
14
|
+
self.source = source
|
15
|
+
super().__init__(cause)
|
@@ -0,0 +1,91 @@
|
|
1
|
+
from typing import Any
|
2
|
+
|
3
|
+
from .constants import (
|
4
|
+
AgentExecutor,
|
5
|
+
BaseChatMemory,
|
6
|
+
BaseChatModel,
|
7
|
+
BaseDocumentCompressor,
|
8
|
+
BaseLanguageModel,
|
9
|
+
BaseLLM,
|
10
|
+
BaseLoader,
|
11
|
+
BaseMemory,
|
12
|
+
BaseOutputParser,
|
13
|
+
BasePromptTemplate,
|
14
|
+
BaseRetriever,
|
15
|
+
Callable,
|
16
|
+
Chain,
|
17
|
+
ChatPromptTemplate,
|
18
|
+
Code,
|
19
|
+
Data,
|
20
|
+
Document,
|
21
|
+
Embeddings,
|
22
|
+
LanguageModel,
|
23
|
+
NestedDict,
|
24
|
+
Object,
|
25
|
+
PromptTemplate,
|
26
|
+
Retriever,
|
27
|
+
Text,
|
28
|
+
TextSplitter,
|
29
|
+
Tool,
|
30
|
+
VectorStore,
|
31
|
+
)
|
32
|
+
from .range_spec import RangeSpec
|
33
|
+
|
34
|
+
|
35
|
+
def _import_input_class():
|
36
|
+
from lfx.template.field.base import Input
|
37
|
+
|
38
|
+
return Input
|
39
|
+
|
40
|
+
|
41
|
+
def _import_output_class():
|
42
|
+
from lfx.template.field.base import Output
|
43
|
+
|
44
|
+
return Output
|
45
|
+
|
46
|
+
|
47
|
+
def __getattr__(name: str) -> Any:
|
48
|
+
# This is to avoid circular imports
|
49
|
+
if name == "Input":
|
50
|
+
return _import_input_class()
|
51
|
+
if name == "Output":
|
52
|
+
return _import_output_class()
|
53
|
+
if name == "RangeSpec":
|
54
|
+
return RangeSpec
|
55
|
+
# The other names should work as if they were imported from constants
|
56
|
+
# Import the constants module langflow.field_typing.constants
|
57
|
+
from . import constants
|
58
|
+
|
59
|
+
return getattr(constants, name)
|
60
|
+
|
61
|
+
|
62
|
+
__all__ = [
|
63
|
+
"AgentExecutor",
|
64
|
+
"BaseChatMemory",
|
65
|
+
"BaseChatModel",
|
66
|
+
"BaseDocumentCompressor",
|
67
|
+
"BaseLLM",
|
68
|
+
"BaseLanguageModel",
|
69
|
+
"BaseLoader",
|
70
|
+
"BaseMemory",
|
71
|
+
"BaseOutputParser",
|
72
|
+
"BasePromptTemplate",
|
73
|
+
"BaseRetriever",
|
74
|
+
"Callable",
|
75
|
+
"Chain",
|
76
|
+
"ChatPromptTemplate",
|
77
|
+
"Code",
|
78
|
+
"Data",
|
79
|
+
"Document",
|
80
|
+
"Embeddings",
|
81
|
+
"LanguageModel",
|
82
|
+
"NestedDict",
|
83
|
+
"Object",
|
84
|
+
"PromptTemplate",
|
85
|
+
"RangeSpec",
|
86
|
+
"Retriever",
|
87
|
+
"Text",
|
88
|
+
"TextSplitter",
|
89
|
+
"Tool",
|
90
|
+
"VectorStore",
|
91
|
+
]
|