lfx-nightly 0.2.0.dev25__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.
Potentially problematic release.
This version of lfx-nightly might be problematic. Click here for more details.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/_assets/component_index.json +1 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +375 -0
- lfx/base/agents/altk_base_agent.py +380 -0
- lfx/base/agents/altk_tool_wrappers.py +565 -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 +430 -0
- lfx/base/agents/utils.py +237 -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 +2584 -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 +810 -0
- lfx/base/data/docling_utils.py +338 -0
- lfx/base/data/storage_utils.py +192 -0
- lfx/base/data/utils.py +362 -0
- lfx/base/datastax/__init__.py +5 -0
- lfx/base/datastax/astradb_base.py +896 -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/embeddings_class.py +113 -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 +21 -0
- lfx/base/io/text.py +22 -0
- lfx/base/knowledge_bases/__init__.py +3 -0
- lfx/base/knowledge_bases/knowledge_base_utils.py +137 -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 +1659 -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 +51 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/cometapi_constants.py +54 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/google_generative_ai_model.py +38 -0
- lfx/base/models/groq_constants.py +150 -0
- lfx/base/models/groq_model_discovery.py +265 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +378 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +108 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +52 -0
- lfx/base/models/openai_constants.py +129 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/models/watsonx_constants.py +36 -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 +698 -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 +327 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +506 -0
- lfx/cli/script_loader.py +289 -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 +428 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +115 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/altk/__init__.py +34 -0
- lfx/components/altk/altk_agent.py +193 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_converse.py +195 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +130 -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 +169 -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 +169 -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/cometapi/__init__.py +32 -0
- lfx/components/cometapi/cometapi.py +166 -0
- lfx/components/composio/__init__.py +222 -0
- lfx/components/composio/agentql_composio.py +11 -0
- lfx/components/composio/agiled_composio.py +11 -0
- lfx/components/composio/airtable_composio.py +11 -0
- lfx/components/composio/apollo_composio.py +11 -0
- lfx/components/composio/asana_composio.py +11 -0
- lfx/components/composio/attio_composio.py +11 -0
- lfx/components/composio/bitbucket_composio.py +11 -0
- lfx/components/composio/bolna_composio.py +11 -0
- lfx/components/composio/brightdata_composio.py +11 -0
- lfx/components/composio/calendly_composio.py +11 -0
- lfx/components/composio/canva_composio.py +11 -0
- lfx/components/composio/canvas_composio.py +11 -0
- lfx/components/composio/coda_composio.py +11 -0
- lfx/components/composio/composio_api.py +278 -0
- lfx/components/composio/contentful_composio.py +11 -0
- lfx/components/composio/digicert_composio.py +11 -0
- lfx/components/composio/discord_composio.py +11 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/elevenlabs_composio.py +11 -0
- lfx/components/composio/exa_composio.py +11 -0
- lfx/components/composio/figma_composio.py +11 -0
- lfx/components/composio/finage_composio.py +11 -0
- lfx/components/composio/firecrawl_composio.py +11 -0
- lfx/components/composio/fireflies_composio.py +11 -0
- lfx/components/composio/fixer_composio.py +11 -0
- lfx/components/composio/flexisign_composio.py +11 -0
- lfx/components/composio/freshdesk_composio.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlebigquery_composio.py +11 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googleclassroom_composio.py +11 -0
- lfx/components/composio/googledocs_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googlesheets_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/heygen_composio.py +11 -0
- lfx/components/composio/instagram_composio.py +11 -0
- lfx/components/composio/jira_composio.py +11 -0
- lfx/components/composio/jotform_composio.py +11 -0
- lfx/components/composio/klaviyo_composio.py +11 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/listennotes_composio.py +11 -0
- lfx/components/composio/mem0_composio.py +11 -0
- lfx/components/composio/miro_composio.py +11 -0
- lfx/components/composio/missive_composio.py +11 -0
- lfx/components/composio/notion_composio.py +11 -0
- lfx/components/composio/onedrive_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/pandadoc_composio.py +11 -0
- lfx/components/composio/peopledatalabs_composio.py +11 -0
- lfx/components/composio/perplexityai_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/serpapi_composio.py +11 -0
- lfx/components/composio/slack_composio.py +11 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/snowflake_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/tavily_composio.py +11 -0
- lfx/components/composio/timelinesai_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/wrike_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 +108 -0
- lfx/components/crewai/hierarchical_crew.py +47 -0
- lfx/components/crewai/hierarchical_task.py +45 -0
- lfx/components/crewai/sequential_crew.py +53 -0
- lfx/components/crewai/sequential_task.py +74 -0
- lfx/components/crewai/sequential_task_agent.py +144 -0
- lfx/components/cuga/__init__.py +34 -0
- lfx/components/cuga/cuga_agent.py +730 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +114 -0
- lfx/components/data_source/__init__.py +58 -0
- lfx/components/data_source/api_request.py +577 -0
- lfx/components/data_source/csv_to_data.py +101 -0
- lfx/components/data_source/json_to_data.py +106 -0
- lfx/components/data_source/mock_data.py +398 -0
- lfx/components/data_source/news_search.py +166 -0
- lfx/components/data_source/rss.py +71 -0
- lfx/components/data_source/sql_executor.py +101 -0
- lfx/components/data_source/url.py +311 -0
- lfx/components/data_source/web_search.py +326 -0
- lfx/components/datastax/__init__.py +76 -0
- lfx/components/datastax/astradb_assistant_manager.py +307 -0
- lfx/components/datastax/astradb_chatmemory.py +40 -0
- lfx/components/datastax/astradb_cql.py +288 -0
- lfx/components/datastax/astradb_graph.py +217 -0
- lfx/components/datastax/astradb_tool.py +378 -0
- lfx/components/datastax/astradb_vectorize.py +122 -0
- lfx/components/datastax/astradb_vectorstore.py +449 -0
- lfx/components/datastax/create_assistant.py +59 -0
- lfx/components/datastax/create_thread.py +33 -0
- lfx/components/datastax/dotenv.py +36 -0
- lfx/components/datastax/get_assistant.py +38 -0
- lfx/components/datastax/getenvvar.py +31 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +315 -0
- lfx/components/datastax/list_assistants.py +26 -0
- lfx/components/datastax/run.py +90 -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 +238 -0
- lfx/components/docling/docling_remote.py +195 -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 +789 -0
- lfx/components/elastic/opensearch_multimodal.py +1575 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +77 -0
- lfx/components/embeddings/text_embedder.py +65 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/files_and_knowledge/__init__.py +47 -0
- lfx/components/files_and_knowledge/directory.py +113 -0
- lfx/components/files_and_knowledge/file.py +841 -0
- lfx/components/files_and_knowledge/ingestion.py +694 -0
- lfx/components/files_and_knowledge/retrieval.py +264 -0
- lfx/components/files_and_knowledge/save_file.py +746 -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/flow_controls/__init__.py +58 -0
- lfx/components/flow_controls/conditional_router.py +208 -0
- lfx/components/flow_controls/data_conditional_router.py +126 -0
- lfx/components/flow_controls/flow_tool.py +111 -0
- lfx/components/flow_controls/listen.py +29 -0
- lfx/components/flow_controls/loop.py +163 -0
- lfx/components/flow_controls/notify.py +88 -0
- lfx/components/flow_controls/pass_message.py +36 -0
- lfx/components/flow_controls/run_flow.py +108 -0
- lfx/components/flow_controls/sub_flow.py +115 -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 +193 -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 +144 -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 +143 -0
- lfx/components/helpers/__init__.py +154 -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 +199 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +207 -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 +40 -0
- lfx/components/input_output/chat.py +109 -0
- lfx/components/input_output/chat_output.py +184 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/input_output/webhook.py +56 -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/knowledge_bases/__init__.py +89 -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 +175 -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 +100 -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/llm_operations/__init__.py +46 -0
- lfx/components/llm_operations/batch_run.py +205 -0
- lfx/components/llm_operations/lambda_filter.py +218 -0
- lfx/components/llm_operations/llm_conditional_router.py +421 -0
- lfx/components/llm_operations/llm_selector.py +499 -0
- lfx/components/llm_operations/structured_output.py +244 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +133 -0
- lfx/components/logic/__init__.py +181 -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 +147 -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 +89 -0
- lfx/components/models_and_agents/__init__.py +49 -0
- lfx/components/models_and_agents/agent.py +644 -0
- lfx/components/models_and_agents/embedding_model.py +423 -0
- lfx/components/models_and_agents/language_model.py +398 -0
- lfx/components/models_and_agents/mcp_component.py +594 -0
- lfx/components/models_and_agents/memory.py +268 -0
- lfx/components/models_and_agents/prompt.py +67 -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 +151 -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 +548 -0
- lfx/components/ollama/ollama_embeddings.py +103 -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 +104 -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 +72 -0
- lfx/components/processing/alter_metadata.py +109 -0
- lfx/components/processing/combine_text.py +40 -0
- lfx/components/processing/converter.py +248 -0
- lfx/components/processing/create_data.py +111 -0
- lfx/components/processing/create_list.py +40 -0
- lfx/components/processing/data_operations.py +528 -0
- lfx/components/processing/data_to_dataframe.py +71 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/dataframe_to_toolset.py +259 -0
- lfx/components/processing/dynamic_create_data.py +357 -0
- lfx/components/processing/extract_key.py +54 -0
- lfx/components/processing/filter_data.py +43 -0
- lfx/components/processing/filter_data_values.py +89 -0
- lfx/components/processing/json_cleaner.py +104 -0
- lfx/components/processing/merge_data.py +91 -0
- lfx/components/processing/message_to_data.py +37 -0
- lfx/components/processing/output_parser.py +46 -0
- lfx/components/processing/parse_data.py +71 -0
- lfx/components/processing/parse_dataframe.py +69 -0
- lfx/components/processing/parse_json_data.py +91 -0
- lfx/components/processing/parser.py +148 -0
- lfx/components/processing/regex.py +83 -0
- lfx/components/processing/select_data.py +49 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/store_message.py +91 -0
- lfx/components/processing/update_data.py +161 -0
- lfx/components/prototypes/__init__.py +35 -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 +66 -0
- lfx/components/tools/calculator.py +109 -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 +328 -0
- lfx/components/tools/python_repl.py +98 -0
- lfx/components/tools/search_api.py +88 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +120 -0
- lfx/components/tools/tavily_search_tool.py +345 -0
- lfx/components/tools/wikidata_api.py +103 -0
- lfx/components/tools/wikipedia_api.py +50 -0
- lfx/components/tools/yahoo_finance.py +130 -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 +301 -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 +191 -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/utilities/__init__.py +43 -0
- lfx/components/utilities/calculator_core.py +89 -0
- lfx/components/utilities/current_date.py +42 -0
- lfx/components/utilities/id_generator.py +42 -0
- lfx/components/utilities/python_repl_core.py +98 -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 +34 -0
- lfx/components/vectorstores/local_db.py +270 -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/vlmrun/__init__.py +34 -0
- lfx/components/vlmrun/vlmrun_transcription.py +224 -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 +206 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +45 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +87 -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 +1890 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +650 -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 +523 -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 +216 -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 +300 -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 +2298 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +53 -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 +250 -0
- lfx/graph/utils.py +206 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +826 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +316 -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 +141 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +308 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +352 -0
- lfx/inputs/inputs.py +718 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +897 -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 +317 -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 +295 -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 +411 -0
- lfx/logging/__init__.py +11 -0
- lfx/logging/logger.py +24 -0
- lfx/memory/__init__.py +70 -0
- lfx/memory/stubs.py +302 -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/cross_module.py +80 -0
- lfx/schema/data.py +309 -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 +184 -0
- lfx/schema/json_schema.py +186 -0
- lfx/schema/log.py +62 -0
- lfx/schema/message.py +493 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +180 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +142 -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 +26 -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/database/__init__.py +5 -0
- lfx/services/database/service.py +25 -0
- lfx/services/deps.py +194 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +185 -0
- lfx/services/mcp_composer/__init__.py +6 -0
- lfx/services/mcp_composer/factory.py +16 -0
- lfx/services/mcp_composer/service.py +1441 -0
- lfx/services/schema.py +21 -0
- lfx/services/session.py +87 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +133 -0
- lfx/services/settings/base.py +668 -0
- lfx/services/settings/constants.py +43 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +11 -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 +185 -0
- lfx/services/storage/service.py +177 -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 +260 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +214 -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 +233 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +34 -0
- lfx/utils/image.py +79 -0
- lfx/utils/langflow_utils.py +52 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/ssrf_protection.py +384 -0
- lfx/utils/util.py +626 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/validate_cloud.py +26 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.2.0.dev25.dist-info/METADATA +312 -0
- lfx_nightly-0.2.0.dev25.dist-info/RECORD +769 -0
- lfx_nightly-0.2.0.dev25.dist-info/WHEEL +4 -0
- lfx_nightly-0.2.0.dev25.dist-info/entry_points.txt +2 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
from pydantic import BaseModel, Field, create_model
|
|
2
|
+
from trustcall import create_extractor
|
|
3
|
+
|
|
4
|
+
from lfx.base.models.chat_result import get_chat_result
|
|
5
|
+
from lfx.custom.custom_component.component import Component
|
|
6
|
+
from lfx.helpers.base_model import build_model_from_schema
|
|
7
|
+
from lfx.io import (
|
|
8
|
+
HandleInput,
|
|
9
|
+
MessageTextInput,
|
|
10
|
+
MultilineInput,
|
|
11
|
+
Output,
|
|
12
|
+
TableInput,
|
|
13
|
+
)
|
|
14
|
+
from lfx.log.logger import logger
|
|
15
|
+
from lfx.schema.data import Data
|
|
16
|
+
from lfx.schema.dataframe import DataFrame
|
|
17
|
+
from lfx.schema.table import EditMode
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class StructuredOutputComponent(Component):
|
|
21
|
+
display_name = "Structured Output"
|
|
22
|
+
description = "Uses an LLM to generate structured data. Ideal for extraction and consistency."
|
|
23
|
+
documentation: str = "https://docs.langflow.org/structured-output"
|
|
24
|
+
name = "StructuredOutput"
|
|
25
|
+
icon = "braces"
|
|
26
|
+
|
|
27
|
+
inputs = [
|
|
28
|
+
HandleInput(
|
|
29
|
+
name="llm",
|
|
30
|
+
display_name="Language Model",
|
|
31
|
+
info="The language model to use to generate the structured output.",
|
|
32
|
+
input_types=["LanguageModel"],
|
|
33
|
+
required=True,
|
|
34
|
+
),
|
|
35
|
+
MultilineInput(
|
|
36
|
+
name="input_value",
|
|
37
|
+
display_name="Input Message",
|
|
38
|
+
info="The input message to the language model.",
|
|
39
|
+
tool_mode=True,
|
|
40
|
+
required=True,
|
|
41
|
+
),
|
|
42
|
+
MultilineInput(
|
|
43
|
+
name="system_prompt",
|
|
44
|
+
display_name="Format Instructions",
|
|
45
|
+
info="The instructions to the language model for formatting the output.",
|
|
46
|
+
value=(
|
|
47
|
+
"You are an AI that extracts structured JSON objects from unstructured text. "
|
|
48
|
+
"Use a predefined schema with expected types (str, int, float, bool, dict). "
|
|
49
|
+
"Extract ALL relevant instances that match the schema - if multiple patterns exist, capture them all. "
|
|
50
|
+
"Fill missing or ambiguous values with defaults: null for missing values. "
|
|
51
|
+
"Remove exact duplicates but keep variations that have different field values. "
|
|
52
|
+
"Always return valid JSON in the expected format, never throw errors. "
|
|
53
|
+
"If multiple objects can be extracted, return them all in the structured format."
|
|
54
|
+
),
|
|
55
|
+
required=True,
|
|
56
|
+
advanced=True,
|
|
57
|
+
),
|
|
58
|
+
MessageTextInput(
|
|
59
|
+
name="schema_name",
|
|
60
|
+
display_name="Schema Name",
|
|
61
|
+
info="Provide a name for the output data schema.",
|
|
62
|
+
advanced=True,
|
|
63
|
+
),
|
|
64
|
+
TableInput(
|
|
65
|
+
name="output_schema",
|
|
66
|
+
display_name="Output Schema",
|
|
67
|
+
info="Define the structure and data types for the model's output.",
|
|
68
|
+
required=True,
|
|
69
|
+
# TODO: remove deault value
|
|
70
|
+
table_schema=[
|
|
71
|
+
{
|
|
72
|
+
"name": "name",
|
|
73
|
+
"display_name": "Name",
|
|
74
|
+
"type": "str",
|
|
75
|
+
"description": "Specify the name of the output field.",
|
|
76
|
+
"default": "field",
|
|
77
|
+
"edit_mode": EditMode.INLINE,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "description",
|
|
81
|
+
"display_name": "Description",
|
|
82
|
+
"type": "str",
|
|
83
|
+
"description": "Describe the purpose of the output field.",
|
|
84
|
+
"default": "description of field",
|
|
85
|
+
"edit_mode": EditMode.POPOVER,
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"name": "type",
|
|
89
|
+
"display_name": "Type",
|
|
90
|
+
"type": "str",
|
|
91
|
+
"edit_mode": EditMode.INLINE,
|
|
92
|
+
"description": ("Indicate the data type of the output field (e.g., str, int, float, bool, dict)."),
|
|
93
|
+
"options": ["str", "int", "float", "bool", "dict"],
|
|
94
|
+
"default": "str",
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"name": "multiple",
|
|
98
|
+
"display_name": "As List",
|
|
99
|
+
"type": "boolean",
|
|
100
|
+
"description": "Set to True if this output field should be a list of the specified type.",
|
|
101
|
+
"default": "False",
|
|
102
|
+
"edit_mode": EditMode.INLINE,
|
|
103
|
+
},
|
|
104
|
+
],
|
|
105
|
+
value=[
|
|
106
|
+
{
|
|
107
|
+
"name": "field",
|
|
108
|
+
"description": "description of field",
|
|
109
|
+
"type": "str",
|
|
110
|
+
"multiple": "False",
|
|
111
|
+
}
|
|
112
|
+
],
|
|
113
|
+
),
|
|
114
|
+
]
|
|
115
|
+
|
|
116
|
+
outputs = [
|
|
117
|
+
Output(
|
|
118
|
+
name="structured_output",
|
|
119
|
+
display_name="Structured Output",
|
|
120
|
+
method="build_structured_output",
|
|
121
|
+
),
|
|
122
|
+
Output(
|
|
123
|
+
name="dataframe_output",
|
|
124
|
+
display_name="Structured Output",
|
|
125
|
+
method="build_structured_dataframe",
|
|
126
|
+
),
|
|
127
|
+
]
|
|
128
|
+
|
|
129
|
+
def build_structured_output_base(self):
|
|
130
|
+
schema_name = self.schema_name or "OutputModel"
|
|
131
|
+
|
|
132
|
+
if not hasattr(self.llm, "with_structured_output"):
|
|
133
|
+
msg = "Language model does not support structured output."
|
|
134
|
+
raise TypeError(msg)
|
|
135
|
+
if not self.output_schema:
|
|
136
|
+
msg = "Output schema cannot be empty"
|
|
137
|
+
raise ValueError(msg)
|
|
138
|
+
|
|
139
|
+
output_model_ = build_model_from_schema(self.output_schema)
|
|
140
|
+
output_model = create_model(
|
|
141
|
+
schema_name,
|
|
142
|
+
__doc__=f"A list of {schema_name}.",
|
|
143
|
+
objects=(
|
|
144
|
+
list[output_model_],
|
|
145
|
+
Field(
|
|
146
|
+
description=f"A list of {schema_name}.", # type: ignore[valid-type]
|
|
147
|
+
min_length=1, # help ensure non-empty output
|
|
148
|
+
),
|
|
149
|
+
),
|
|
150
|
+
)
|
|
151
|
+
# Tracing config
|
|
152
|
+
config_dict = {
|
|
153
|
+
"run_name": self.display_name,
|
|
154
|
+
"project_name": self.get_project_name(),
|
|
155
|
+
"callbacks": self.get_langchain_callbacks(),
|
|
156
|
+
}
|
|
157
|
+
# Generate structured output using Trustcall first, then fallback to Langchain if it fails
|
|
158
|
+
result = self._extract_output_with_trustcall(output_model, config_dict)
|
|
159
|
+
if result is None:
|
|
160
|
+
result = self._extract_output_with_langchain(output_model, config_dict)
|
|
161
|
+
|
|
162
|
+
# OPTIMIZATION NOTE: Simplified processing based on trustcall response structure
|
|
163
|
+
# Handle non-dict responses (shouldn't happen with trustcall, but defensive)
|
|
164
|
+
if not isinstance(result, dict):
|
|
165
|
+
return result
|
|
166
|
+
|
|
167
|
+
# Extract first response and convert BaseModel to dict
|
|
168
|
+
responses = result.get("responses", [])
|
|
169
|
+
if not responses:
|
|
170
|
+
return result
|
|
171
|
+
|
|
172
|
+
# Convert BaseModel to dict (creates the "objects" key)
|
|
173
|
+
first_response = responses[0]
|
|
174
|
+
structured_data = first_response
|
|
175
|
+
if isinstance(first_response, BaseModel):
|
|
176
|
+
structured_data = first_response.model_dump()
|
|
177
|
+
# Extract the objects array (guaranteed to exist due to our Pydantic model structure)
|
|
178
|
+
return structured_data.get("objects", structured_data)
|
|
179
|
+
|
|
180
|
+
def build_structured_output(self) -> Data:
|
|
181
|
+
output = self.build_structured_output_base()
|
|
182
|
+
if not isinstance(output, list) or not output:
|
|
183
|
+
# handle empty or unexpected type case
|
|
184
|
+
msg = "No structured output returned"
|
|
185
|
+
raise ValueError(msg)
|
|
186
|
+
if len(output) == 1:
|
|
187
|
+
return Data(data=output[0])
|
|
188
|
+
if len(output) > 1:
|
|
189
|
+
# Multiple outputs - wrap them in a results container
|
|
190
|
+
return Data(data={"results": output})
|
|
191
|
+
return Data()
|
|
192
|
+
|
|
193
|
+
def build_structured_dataframe(self) -> DataFrame:
|
|
194
|
+
output = self.build_structured_output_base()
|
|
195
|
+
if not isinstance(output, list) or not output:
|
|
196
|
+
# handle empty or unexpected type case
|
|
197
|
+
msg = "No structured output returned"
|
|
198
|
+
raise ValueError(msg)
|
|
199
|
+
if len(output) == 1:
|
|
200
|
+
# For single dictionary, wrap in a list to create DataFrame with one row
|
|
201
|
+
return DataFrame([output[0]])
|
|
202
|
+
if len(output) > 1:
|
|
203
|
+
# Multiple outputs - convert to DataFrame directly
|
|
204
|
+
return DataFrame(output)
|
|
205
|
+
return DataFrame()
|
|
206
|
+
|
|
207
|
+
def _extract_output_with_trustcall(self, schema: BaseModel, config_dict: dict) -> list[BaseModel] | None:
|
|
208
|
+
try:
|
|
209
|
+
llm_with_structured_output = create_extractor(self.llm, tools=[schema], tool_choice=schema.__name__)
|
|
210
|
+
result = get_chat_result(
|
|
211
|
+
runnable=llm_with_structured_output,
|
|
212
|
+
system_message=self.system_prompt,
|
|
213
|
+
input_value=self.input_value,
|
|
214
|
+
config=config_dict,
|
|
215
|
+
)
|
|
216
|
+
except Exception as e: # noqa: BLE001
|
|
217
|
+
logger.warning(
|
|
218
|
+
f"Trustcall extraction failed, falling back to Langchain: {e} "
|
|
219
|
+
"(Note: This may not be an error—some models or configurations do not support tool calling. "
|
|
220
|
+
"Falling back is normal in such cases.)"
|
|
221
|
+
)
|
|
222
|
+
return None
|
|
223
|
+
return result or None # langchain fallback is used if error occurs or the result is empty
|
|
224
|
+
|
|
225
|
+
def _extract_output_with_langchain(self, schema: BaseModel, config_dict: dict) -> list[BaseModel] | None:
|
|
226
|
+
try:
|
|
227
|
+
llm_with_structured_output = self.llm.with_structured_output(schema)
|
|
228
|
+
result = get_chat_result(
|
|
229
|
+
runnable=llm_with_structured_output,
|
|
230
|
+
system_message=self.system_prompt,
|
|
231
|
+
input_value=self.input_value,
|
|
232
|
+
config=config_dict,
|
|
233
|
+
)
|
|
234
|
+
if isinstance(result, BaseModel):
|
|
235
|
+
result = result.model_dump()
|
|
236
|
+
result = result.get("objects", result)
|
|
237
|
+
except Exception as fallback_error:
|
|
238
|
+
msg = (
|
|
239
|
+
f"Model does not support tool calling (trustcall failed) "
|
|
240
|
+
f"and fallback with_structured_output also failed: {fallback_error}"
|
|
241
|
+
)
|
|
242
|
+
raise ValueError(msg) from fallback_error
|
|
243
|
+
|
|
244
|
+
return result or None
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from lfx.components._importing import import_mod
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from lfx.components.lmstudio.lmstudioembeddings import LMStudioEmbeddingsComponent
|
|
9
|
+
from lfx.components.lmstudio.lmstudiomodel import LMStudioModelComponent
|
|
10
|
+
|
|
11
|
+
_dynamic_imports = {
|
|
12
|
+
"LMStudioEmbeddingsComponent": "lmstudioembeddings",
|
|
13
|
+
"LMStudioModelComponent": "lmstudiomodel",
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
__all__ = ["LMStudioEmbeddingsComponent", "LMStudioModelComponent"]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import lmstudio components on attribute access."""
|
|
21
|
+
if attr_name not in _dynamic_imports:
|
|
22
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
23
|
+
raise AttributeError(msg)
|
|
24
|
+
try:
|
|
25
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
26
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
27
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
28
|
+
raise AttributeError(msg) from e
|
|
29
|
+
globals()[attr_name] = result
|
|
30
|
+
return result
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def __dir__() -> list[str]:
|
|
34
|
+
return list(__all__)
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
from urllib.parse import urljoin
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
|
|
6
|
+
from lfx.base.embeddings.model import LCEmbeddingsModel
|
|
7
|
+
from lfx.field_typing import Embeddings
|
|
8
|
+
from lfx.inputs.inputs import DropdownInput, SecretStrInput
|
|
9
|
+
from lfx.io import FloatInput, MessageTextInput
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class LMStudioEmbeddingsComponent(LCEmbeddingsModel):
|
|
13
|
+
display_name: str = "LM Studio Embeddings"
|
|
14
|
+
description: str = "Generate embeddings using LM Studio."
|
|
15
|
+
icon = "LMStudio"
|
|
16
|
+
|
|
17
|
+
async def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None): # noqa: ARG002
|
|
18
|
+
if field_name == "model":
|
|
19
|
+
base_url_dict = build_config.get("base_url", {})
|
|
20
|
+
base_url_load_from_db = base_url_dict.get("load_from_db", False)
|
|
21
|
+
base_url_value = base_url_dict.get("value")
|
|
22
|
+
if base_url_load_from_db:
|
|
23
|
+
base_url_value = await self.get_variables(base_url_value, field_name)
|
|
24
|
+
elif not base_url_value:
|
|
25
|
+
base_url_value = "http://localhost:1234/v1"
|
|
26
|
+
build_config["model"]["options"] = await self.get_model(base_url_value)
|
|
27
|
+
|
|
28
|
+
return build_config
|
|
29
|
+
|
|
30
|
+
@staticmethod
|
|
31
|
+
async def get_model(base_url_value: str) -> list[str]:
|
|
32
|
+
try:
|
|
33
|
+
url = urljoin(base_url_value, "/v1/models")
|
|
34
|
+
async with httpx.AsyncClient() as client:
|
|
35
|
+
response = await client.get(url)
|
|
36
|
+
response.raise_for_status()
|
|
37
|
+
data = response.json()
|
|
38
|
+
|
|
39
|
+
return [model["id"] for model in data.get("data", [])]
|
|
40
|
+
except Exception as e:
|
|
41
|
+
msg = "Could not retrieve models. Please, make sure the LM Studio server is running."
|
|
42
|
+
raise ValueError(msg) from e
|
|
43
|
+
|
|
44
|
+
inputs = [
|
|
45
|
+
DropdownInput(
|
|
46
|
+
name="model",
|
|
47
|
+
display_name="Model",
|
|
48
|
+
advanced=False,
|
|
49
|
+
refresh_button=True,
|
|
50
|
+
required=True,
|
|
51
|
+
),
|
|
52
|
+
MessageTextInput(
|
|
53
|
+
name="base_url",
|
|
54
|
+
display_name="LM Studio Base URL",
|
|
55
|
+
refresh_button=True,
|
|
56
|
+
value="http://localhost:1234/v1",
|
|
57
|
+
required=True,
|
|
58
|
+
),
|
|
59
|
+
SecretStrInput(
|
|
60
|
+
name="api_key",
|
|
61
|
+
display_name="LM Studio API Key",
|
|
62
|
+
advanced=True,
|
|
63
|
+
value="LMSTUDIO_API_KEY",
|
|
64
|
+
),
|
|
65
|
+
FloatInput(
|
|
66
|
+
name="temperature",
|
|
67
|
+
display_name="Model Temperature",
|
|
68
|
+
value=0.1,
|
|
69
|
+
advanced=True,
|
|
70
|
+
),
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
def build_embeddings(self) -> Embeddings:
|
|
74
|
+
try:
|
|
75
|
+
from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings
|
|
76
|
+
except ImportError as e:
|
|
77
|
+
msg = "Please install langchain-nvidia-ai-endpoints to use LM Studio Embeddings."
|
|
78
|
+
raise ImportError(msg) from e
|
|
79
|
+
try:
|
|
80
|
+
output = NVIDIAEmbeddings(
|
|
81
|
+
model=self.model,
|
|
82
|
+
base_url=self.base_url,
|
|
83
|
+
temperature=self.temperature,
|
|
84
|
+
nvidia_api_key=self.api_key,
|
|
85
|
+
)
|
|
86
|
+
except Exception as e:
|
|
87
|
+
msg = f"Could not connect to LM Studio API. Error: {e}"
|
|
88
|
+
raise ValueError(msg) from e
|
|
89
|
+
return output
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
from urllib.parse import urljoin
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
from langchain_openai import ChatOpenAI
|
|
6
|
+
|
|
7
|
+
from lfx.base.models.model import LCModelComponent
|
|
8
|
+
from lfx.field_typing import LanguageModel
|
|
9
|
+
from lfx.field_typing.range_spec import RangeSpec
|
|
10
|
+
from lfx.inputs.inputs import DictInput, DropdownInput, FloatInput, IntInput, SecretStrInput, StrInput
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class LMStudioModelComponent(LCModelComponent):
|
|
14
|
+
display_name = "LM Studio"
|
|
15
|
+
description = "Generate text using LM Studio Local LLMs."
|
|
16
|
+
icon = "LMStudio"
|
|
17
|
+
name = "LMStudioModel"
|
|
18
|
+
|
|
19
|
+
async def update_build_config(self, build_config: dict, field_value: Any, field_name: str | None = None): # noqa: ARG002
|
|
20
|
+
if field_name == "model_name":
|
|
21
|
+
base_url_dict = build_config.get("base_url", {})
|
|
22
|
+
base_url_load_from_db = base_url_dict.get("load_from_db", False)
|
|
23
|
+
base_url_value = base_url_dict.get("value")
|
|
24
|
+
if base_url_load_from_db:
|
|
25
|
+
base_url_value = await self.get_variables(base_url_value, field_name)
|
|
26
|
+
try:
|
|
27
|
+
async with httpx.AsyncClient() as client:
|
|
28
|
+
response = await client.get(urljoin(base_url_value, "/v1/models"), timeout=2.0)
|
|
29
|
+
response.raise_for_status()
|
|
30
|
+
except httpx.HTTPError:
|
|
31
|
+
msg = "Could not access the default LM Studio URL. Please, specify the 'Base URL' field."
|
|
32
|
+
self.log(msg)
|
|
33
|
+
return build_config
|
|
34
|
+
build_config["model_name"]["options"] = await self.get_model(base_url_value)
|
|
35
|
+
|
|
36
|
+
return build_config
|
|
37
|
+
|
|
38
|
+
@staticmethod
|
|
39
|
+
async def get_model(base_url_value: str) -> list[str]:
|
|
40
|
+
try:
|
|
41
|
+
url = urljoin(base_url_value, "/v1/models")
|
|
42
|
+
async with httpx.AsyncClient() as client:
|
|
43
|
+
response = await client.get(url)
|
|
44
|
+
response.raise_for_status()
|
|
45
|
+
data = response.json()
|
|
46
|
+
|
|
47
|
+
return [model["id"] for model in data.get("data", [])]
|
|
48
|
+
except Exception as e:
|
|
49
|
+
msg = "Could not retrieve models. Please, make sure the LM Studio server is running."
|
|
50
|
+
raise ValueError(msg) from e
|
|
51
|
+
|
|
52
|
+
inputs = [
|
|
53
|
+
*LCModelComponent.get_base_inputs(),
|
|
54
|
+
IntInput(
|
|
55
|
+
name="max_tokens",
|
|
56
|
+
display_name="Max Tokens",
|
|
57
|
+
advanced=True,
|
|
58
|
+
info="The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
|
|
59
|
+
range_spec=RangeSpec(min=0, max=128000),
|
|
60
|
+
),
|
|
61
|
+
DictInput(name="model_kwargs", display_name="Model Kwargs", advanced=True),
|
|
62
|
+
DropdownInput(
|
|
63
|
+
name="model_name",
|
|
64
|
+
display_name="Model Name",
|
|
65
|
+
advanced=False,
|
|
66
|
+
refresh_button=True,
|
|
67
|
+
),
|
|
68
|
+
StrInput(
|
|
69
|
+
name="base_url",
|
|
70
|
+
display_name="Base URL",
|
|
71
|
+
advanced=False,
|
|
72
|
+
info="Endpoint of the LM Studio API. Defaults to 'http://localhost:1234/v1' if not specified.",
|
|
73
|
+
value="http://localhost:1234/v1",
|
|
74
|
+
),
|
|
75
|
+
SecretStrInput(
|
|
76
|
+
name="api_key",
|
|
77
|
+
display_name="LM Studio API Key",
|
|
78
|
+
info="The LM Studio API Key to use for LM Studio.",
|
|
79
|
+
advanced=True,
|
|
80
|
+
value="LMSTUDIO_API_KEY",
|
|
81
|
+
),
|
|
82
|
+
FloatInput(
|
|
83
|
+
name="temperature",
|
|
84
|
+
display_name="Temperature",
|
|
85
|
+
value=0.1,
|
|
86
|
+
advanced=True,
|
|
87
|
+
),
|
|
88
|
+
IntInput(
|
|
89
|
+
name="seed",
|
|
90
|
+
display_name="Seed",
|
|
91
|
+
info="The seed controls the reproducibility of the job.",
|
|
92
|
+
advanced=True,
|
|
93
|
+
value=1,
|
|
94
|
+
),
|
|
95
|
+
]
|
|
96
|
+
|
|
97
|
+
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
|
98
|
+
lmstudio_api_key = self.api_key
|
|
99
|
+
temperature = self.temperature
|
|
100
|
+
model_name: str = self.model_name
|
|
101
|
+
max_tokens = self.max_tokens
|
|
102
|
+
model_kwargs = self.model_kwargs or {}
|
|
103
|
+
base_url = self.base_url or "http://localhost:1234/v1"
|
|
104
|
+
seed = self.seed
|
|
105
|
+
|
|
106
|
+
return ChatOpenAI(
|
|
107
|
+
max_tokens=max_tokens or None,
|
|
108
|
+
model_kwargs=model_kwargs,
|
|
109
|
+
model=model_name,
|
|
110
|
+
base_url=base_url,
|
|
111
|
+
api_key=lmstudio_api_key,
|
|
112
|
+
temperature=temperature if temperature is not None else 0.1,
|
|
113
|
+
seed=seed,
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
def _get_exception_message(self, e: Exception):
|
|
117
|
+
"""Get a message from an LM Studio exception.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
e (Exception): The exception to get the message from.
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
str: The message from the exception.
|
|
124
|
+
"""
|
|
125
|
+
try:
|
|
126
|
+
from openai import BadRequestError
|
|
127
|
+
except ImportError:
|
|
128
|
+
return None
|
|
129
|
+
if isinstance(e, BadRequestError):
|
|
130
|
+
message = e.body.get("message")
|
|
131
|
+
if message:
|
|
132
|
+
return message
|
|
133
|
+
return None
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
"""Logic module - backwards compatibility alias for flow_controls.
|
|
2
|
+
|
|
3
|
+
This module provides backwards compatibility by forwarding imports
|
|
4
|
+
to flow_controls where the actual logic components are located.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import sys
|
|
10
|
+
from typing import TYPE_CHECKING, Any
|
|
11
|
+
|
|
12
|
+
from lfx.components._importing import import_mod
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from lfx.components.logic.conditional_router import ConditionalRouterComponent
|
|
16
|
+
from lfx.components.logic.data_conditional_router import DataConditionalRouterComponent
|
|
17
|
+
from lfx.components.logic.flow_tool import FlowToolComponent
|
|
18
|
+
from lfx.components.logic.llm_conditional_router import SmartRouterComponent
|
|
19
|
+
from lfx.components.logic.loop import LoopComponent
|
|
20
|
+
from lfx.components.logic.pass_message import PassMessageComponent
|
|
21
|
+
from lfx.components.logic.run_flow import RunFlowComponent
|
|
22
|
+
from lfx.components.logic.sub_flow import SubFlowComponent
|
|
23
|
+
|
|
24
|
+
_dynamic_imports = {
|
|
25
|
+
"ConditionalRouterComponent": "conditional_router",
|
|
26
|
+
"DataConditionalRouterComponent": "data_conditional_router",
|
|
27
|
+
"FlowToolComponent": "flow_tool",
|
|
28
|
+
"LoopComponent": "loop",
|
|
29
|
+
"PassMessageComponent": "pass_message",
|
|
30
|
+
"RunFlowComponent": "run_flow",
|
|
31
|
+
"SmartRouterComponent": "llm_conditional_router",
|
|
32
|
+
"SubFlowComponent": "sub_flow",
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
__all__ = [
|
|
36
|
+
"ConditionalRouterComponent",
|
|
37
|
+
"DataConditionalRouterComponent",
|
|
38
|
+
"FlowToolComponent",
|
|
39
|
+
"LoopComponent",
|
|
40
|
+
"PassMessageComponent",
|
|
41
|
+
"RunFlowComponent",
|
|
42
|
+
"SmartRouterComponent",
|
|
43
|
+
"SubFlowComponent",
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
# Register redirected submodules in sys.modules for direct importlib.import_module() calls
|
|
47
|
+
# This allows imports like: import lfx.components.logic.listen
|
|
48
|
+
_redirected_submodules = {
|
|
49
|
+
"lfx.components.logic.listen": "lfx.components.flow_controls.listen",
|
|
50
|
+
"lfx.components.logic.loop": "lfx.components.flow_controls.loop",
|
|
51
|
+
"lfx.components.logic.notify": "lfx.components.flow_controls.notify",
|
|
52
|
+
"lfx.components.logic.pass_message": "lfx.components.flow_controls.pass_message",
|
|
53
|
+
"lfx.components.logic.conditional_router": "lfx.components.flow_controls.conditional_router",
|
|
54
|
+
"lfx.components.logic.data_conditional_router": "lfx.components.flow_controls.data_conditional_router",
|
|
55
|
+
"lfx.components.logic.flow_tool": "lfx.components.flow_controls.flow_tool",
|
|
56
|
+
"lfx.components.logic.run_flow": "lfx.components.flow_controls.run_flow",
|
|
57
|
+
"lfx.components.logic.sub_flow": "lfx.components.flow_controls.sub_flow",
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
for old_path, new_path in _redirected_submodules.items():
|
|
61
|
+
if old_path not in sys.modules:
|
|
62
|
+
# Use a lazy loader that imports the actual module when accessed
|
|
63
|
+
class _RedirectedModule:
|
|
64
|
+
def __init__(self, target_path: str, original_path: str):
|
|
65
|
+
self._target_path = target_path
|
|
66
|
+
self._original_path = original_path
|
|
67
|
+
self._module = None
|
|
68
|
+
|
|
69
|
+
def __getattr__(self, name: str) -> Any:
|
|
70
|
+
if self._module is None:
|
|
71
|
+
from importlib import import_module
|
|
72
|
+
|
|
73
|
+
self._module = import_module(self._target_path)
|
|
74
|
+
# Also register under the original path for future imports
|
|
75
|
+
sys.modules[self._original_path] = self._module
|
|
76
|
+
return getattr(self._module, name)
|
|
77
|
+
|
|
78
|
+
def __repr__(self) -> str:
|
|
79
|
+
return f"<redirected module '{self._original_path}' -> '{self._target_path}'>"
|
|
80
|
+
|
|
81
|
+
sys.modules[old_path] = _RedirectedModule(new_path, old_path)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def __getattr__(attr_name: str) -> Any:
|
|
85
|
+
"""Lazily import logic components on attribute access."""
|
|
86
|
+
# Handle submodule access for backwards compatibility
|
|
87
|
+
if attr_name == "listen":
|
|
88
|
+
from importlib import import_module
|
|
89
|
+
|
|
90
|
+
result = import_module("lfx.components.flow_controls.listen")
|
|
91
|
+
globals()[attr_name] = result
|
|
92
|
+
return result
|
|
93
|
+
if attr_name == "loop":
|
|
94
|
+
from importlib import import_module
|
|
95
|
+
|
|
96
|
+
result = import_module("lfx.components.flow_controls.loop")
|
|
97
|
+
globals()[attr_name] = result
|
|
98
|
+
return result
|
|
99
|
+
if attr_name == "notify":
|
|
100
|
+
from importlib import import_module
|
|
101
|
+
|
|
102
|
+
result = import_module("lfx.components.flow_controls.notify")
|
|
103
|
+
globals()[attr_name] = result
|
|
104
|
+
return result
|
|
105
|
+
if attr_name == "pass_message":
|
|
106
|
+
from importlib import import_module
|
|
107
|
+
|
|
108
|
+
result = import_module("lfx.components.flow_controls.pass_message")
|
|
109
|
+
globals()[attr_name] = result
|
|
110
|
+
return result
|
|
111
|
+
if attr_name == "conditional_router":
|
|
112
|
+
from importlib import import_module
|
|
113
|
+
|
|
114
|
+
result = import_module("lfx.components.flow_controls.conditional_router")
|
|
115
|
+
globals()[attr_name] = result
|
|
116
|
+
return result
|
|
117
|
+
if attr_name == "data_conditional_router":
|
|
118
|
+
from importlib import import_module
|
|
119
|
+
|
|
120
|
+
result = import_module("lfx.components.flow_controls.data_conditional_router")
|
|
121
|
+
globals()[attr_name] = result
|
|
122
|
+
return result
|
|
123
|
+
if attr_name == "flow_tool":
|
|
124
|
+
from importlib import import_module
|
|
125
|
+
|
|
126
|
+
result = import_module("lfx.components.flow_controls.flow_tool")
|
|
127
|
+
globals()[attr_name] = result
|
|
128
|
+
return result
|
|
129
|
+
if attr_name == "run_flow":
|
|
130
|
+
from importlib import import_module
|
|
131
|
+
|
|
132
|
+
result = import_module("lfx.components.flow_controls.run_flow")
|
|
133
|
+
globals()[attr_name] = result
|
|
134
|
+
return result
|
|
135
|
+
if attr_name == "sub_flow":
|
|
136
|
+
from importlib import import_module
|
|
137
|
+
|
|
138
|
+
result = import_module("lfx.components.flow_controls.sub_flow")
|
|
139
|
+
globals()[attr_name] = result
|
|
140
|
+
return result
|
|
141
|
+
|
|
142
|
+
if attr_name not in _dynamic_imports:
|
|
143
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
144
|
+
raise AttributeError(msg)
|
|
145
|
+
|
|
146
|
+
# Most logic components were moved to flow_controls
|
|
147
|
+
# Forward them to flow_controls for backwards compatibility
|
|
148
|
+
if attr_name in (
|
|
149
|
+
"ConditionalRouterComponent",
|
|
150
|
+
"DataConditionalRouterComponent",
|
|
151
|
+
"FlowToolComponent",
|
|
152
|
+
"LoopComponent",
|
|
153
|
+
"PassMessageComponent",
|
|
154
|
+
"RunFlowComponent",
|
|
155
|
+
"SubFlowComponent",
|
|
156
|
+
):
|
|
157
|
+
from lfx.components import flow_controls
|
|
158
|
+
|
|
159
|
+
result = getattr(flow_controls, attr_name)
|
|
160
|
+
globals()[attr_name] = result
|
|
161
|
+
return result
|
|
162
|
+
|
|
163
|
+
# SmartRouterComponent was moved to llm_operations
|
|
164
|
+
if attr_name == "SmartRouterComponent":
|
|
165
|
+
from lfx.components import llm_operations
|
|
166
|
+
|
|
167
|
+
result = getattr(llm_operations, attr_name)
|
|
168
|
+
globals()[attr_name] = result
|
|
169
|
+
return result
|
|
170
|
+
|
|
171
|
+
try:
|
|
172
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
173
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
174
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
175
|
+
raise AttributeError(msg) from e
|
|
176
|
+
globals()[attr_name] = result
|
|
177
|
+
return result
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def __dir__() -> list[str]:
|
|
181
|
+
return list(__all__)
|