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,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
|
+
]
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"""Constants for field typing used throughout lfx package."""
|
|
2
|
+
|
|
3
|
+
import importlib.util
|
|
4
|
+
from collections.abc import Callable
|
|
5
|
+
from typing import Text, TypeAlias, TypeVar
|
|
6
|
+
|
|
7
|
+
# Safe imports that don't create circular dependencies
|
|
8
|
+
try:
|
|
9
|
+
from langchain.agents.agent import AgentExecutor
|
|
10
|
+
from langchain.chains.base import Chain
|
|
11
|
+
from langchain.memory.chat_memory import BaseChatMemory
|
|
12
|
+
from langchain_core.chat_history import BaseChatMessageHistory
|
|
13
|
+
from langchain_core.document_loaders import BaseLoader
|
|
14
|
+
from langchain_core.documents import Document
|
|
15
|
+
from langchain_core.documents.compressor import BaseDocumentCompressor
|
|
16
|
+
from langchain_core.embeddings import Embeddings
|
|
17
|
+
from langchain_core.language_models import BaseLanguageModel, BaseLLM
|
|
18
|
+
from langchain_core.language_models.chat_models import BaseChatModel
|
|
19
|
+
from langchain_core.memory import BaseMemory
|
|
20
|
+
from langchain_core.output_parsers import BaseLLMOutputParser, BaseOutputParser
|
|
21
|
+
from langchain_core.prompts import BasePromptTemplate, ChatPromptTemplate, PromptTemplate
|
|
22
|
+
from langchain_core.retrievers import BaseRetriever
|
|
23
|
+
from langchain_core.tools import BaseTool, Tool
|
|
24
|
+
from langchain_core.vectorstores import VectorStore, VectorStoreRetriever
|
|
25
|
+
from langchain_text_splitters import TextSplitter
|
|
26
|
+
except ImportError:
|
|
27
|
+
# Create stub types if langchain is not available
|
|
28
|
+
class AgentExecutor:
|
|
29
|
+
pass
|
|
30
|
+
|
|
31
|
+
class Chain:
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
class BaseChatMemory:
|
|
35
|
+
pass
|
|
36
|
+
|
|
37
|
+
class BaseChatMessageHistory:
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
class BaseLoader:
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
class Document:
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
class BaseDocumentCompressor:
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
class Embeddings:
|
|
50
|
+
pass
|
|
51
|
+
|
|
52
|
+
class BaseLanguageModel:
|
|
53
|
+
pass
|
|
54
|
+
|
|
55
|
+
class BaseLLM:
|
|
56
|
+
pass
|
|
57
|
+
|
|
58
|
+
class BaseChatModel:
|
|
59
|
+
pass
|
|
60
|
+
|
|
61
|
+
class BaseMemory:
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
class BaseLLMOutputParser:
|
|
65
|
+
pass
|
|
66
|
+
|
|
67
|
+
class BaseOutputParser:
|
|
68
|
+
pass
|
|
69
|
+
|
|
70
|
+
class BasePromptTemplate:
|
|
71
|
+
pass
|
|
72
|
+
|
|
73
|
+
class ChatPromptTemplate:
|
|
74
|
+
pass
|
|
75
|
+
|
|
76
|
+
class PromptTemplate:
|
|
77
|
+
pass
|
|
78
|
+
|
|
79
|
+
class BaseRetriever:
|
|
80
|
+
pass
|
|
81
|
+
|
|
82
|
+
class BaseTool:
|
|
83
|
+
pass
|
|
84
|
+
|
|
85
|
+
class Tool:
|
|
86
|
+
pass
|
|
87
|
+
|
|
88
|
+
class VectorStore:
|
|
89
|
+
pass
|
|
90
|
+
|
|
91
|
+
class VectorStoreRetriever:
|
|
92
|
+
pass
|
|
93
|
+
|
|
94
|
+
class TextSplitter:
|
|
95
|
+
pass
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
# Import lfx schema types (avoid circular deps)
|
|
99
|
+
from lfx.schema.data import Data
|
|
100
|
+
|
|
101
|
+
# Type aliases
|
|
102
|
+
NestedDict: TypeAlias = dict[str, str | dict]
|
|
103
|
+
LanguageModel = TypeVar("LanguageModel", BaseLanguageModel, BaseLLM, BaseChatModel)
|
|
104
|
+
ToolEnabledLanguageModel = TypeVar("ToolEnabledLanguageModel", BaseLanguageModel, BaseLLM, BaseChatModel)
|
|
105
|
+
Memory = TypeVar("Memory", bound=BaseChatMessageHistory)
|
|
106
|
+
|
|
107
|
+
Retriever = TypeVar(
|
|
108
|
+
"Retriever",
|
|
109
|
+
BaseRetriever,
|
|
110
|
+
VectorStoreRetriever,
|
|
111
|
+
)
|
|
112
|
+
OutputParser = TypeVar(
|
|
113
|
+
"OutputParser",
|
|
114
|
+
BaseOutputParser,
|
|
115
|
+
BaseLLMOutputParser,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class Object:
|
|
120
|
+
"""Generic object type for custom components."""
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
class Code:
|
|
124
|
+
"""Code type for custom components."""
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
# Langchain base types mapping
|
|
128
|
+
LANGCHAIN_BASE_TYPES = {
|
|
129
|
+
"Chain": Chain,
|
|
130
|
+
"AgentExecutor": AgentExecutor,
|
|
131
|
+
"BaseTool": BaseTool,
|
|
132
|
+
"Tool": Tool,
|
|
133
|
+
"BaseLLM": BaseLLM,
|
|
134
|
+
"BaseLanguageModel": BaseLanguageModel,
|
|
135
|
+
"PromptTemplate": PromptTemplate,
|
|
136
|
+
"ChatPromptTemplate": ChatPromptTemplate,
|
|
137
|
+
"BasePromptTemplate": BasePromptTemplate,
|
|
138
|
+
"BaseLoader": BaseLoader,
|
|
139
|
+
"Document": Document,
|
|
140
|
+
"TextSplitter": TextSplitter,
|
|
141
|
+
"VectorStore": VectorStore,
|
|
142
|
+
"Embeddings": Embeddings,
|
|
143
|
+
"BaseRetriever": BaseRetriever,
|
|
144
|
+
"BaseOutputParser": BaseOutputParser,
|
|
145
|
+
"BaseMemory": BaseMemory,
|
|
146
|
+
"BaseChatMemory": BaseChatMemory,
|
|
147
|
+
"BaseChatModel": BaseChatModel,
|
|
148
|
+
"Memory": Memory,
|
|
149
|
+
"BaseDocumentCompressor": BaseDocumentCompressor,
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
# Langchain base types plus Python base types
|
|
153
|
+
CUSTOM_COMPONENT_SUPPORTED_TYPES = {
|
|
154
|
+
**LANGCHAIN_BASE_TYPES,
|
|
155
|
+
"NestedDict": NestedDict,
|
|
156
|
+
"Data": Data,
|
|
157
|
+
"Text": Text, # noqa: UP019
|
|
158
|
+
"Object": Object,
|
|
159
|
+
"Callable": Callable,
|
|
160
|
+
"LanguageModel": LanguageModel,
|
|
161
|
+
"Retriever": Retriever,
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
# Default import string for component code generation
|
|
165
|
+
LANGCHAIN_IMPORT_STRING = """from langchain.agents.agent import AgentExecutor
|
|
166
|
+
from langchain.chains.base import Chain
|
|
167
|
+
from langchain.memory.chat_memory import BaseChatMemory
|
|
168
|
+
from langchain_core.chat_history import BaseChatMessageHistory
|
|
169
|
+
from langchain_core.document_loaders import BaseLoader
|
|
170
|
+
from langchain_core.documents import Document
|
|
171
|
+
from langchain_core.embeddings import Embeddings
|
|
172
|
+
from langchain_core.language_models import BaseLanguageModel, BaseLLM
|
|
173
|
+
from langchain_core.language_models.chat_models import BaseChatModel
|
|
174
|
+
from langchain_core.memory import BaseMemory
|
|
175
|
+
from langchain_core.output_parsers import BaseLLMOutputParser, BaseOutputParser
|
|
176
|
+
from langchain_core.prompts import BasePromptTemplate, ChatPromptTemplate, PromptTemplate
|
|
177
|
+
from langchain_core.retrievers import BaseRetriever
|
|
178
|
+
from langchain_core.documents.compressor import BaseDocumentCompressor
|
|
179
|
+
from langchain_core.tools import BaseTool, Tool
|
|
180
|
+
from langchain_core.vectorstores import VectorStore, VectorStoreRetriever
|
|
181
|
+
from langchain_text_splitters import TextSplitter
|
|
182
|
+
"""
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
DEFAULT_IMPORT_STRING = """
|
|
186
|
+
|
|
187
|
+
from lfx.io import (
|
|
188
|
+
BoolInput,
|
|
189
|
+
CodeInput,
|
|
190
|
+
DataInput,
|
|
191
|
+
DictInput,
|
|
192
|
+
DropdownInput,
|
|
193
|
+
FileInput,
|
|
194
|
+
FloatInput,
|
|
195
|
+
HandleInput,
|
|
196
|
+
IntInput,
|
|
197
|
+
LinkInput,
|
|
198
|
+
MessageInput,
|
|
199
|
+
MessageTextInput,
|
|
200
|
+
MultilineInput,
|
|
201
|
+
MultilineSecretInput,
|
|
202
|
+
MultiselectInput,
|
|
203
|
+
NestedDictInput,
|
|
204
|
+
Output,
|
|
205
|
+
PromptInput,
|
|
206
|
+
SecretStrInput,
|
|
207
|
+
SliderInput,
|
|
208
|
+
StrInput,
|
|
209
|
+
TableInput,
|
|
210
|
+
)
|
|
211
|
+
from lfx.schema.data import Data
|
|
212
|
+
from lfx.schema.dataframe import DataFrame
|
|
213
|
+
"""
|
|
214
|
+
|
|
215
|
+
if importlib.util.find_spec("langchain") is not None:
|
|
216
|
+
DEFAULT_IMPORT_STRING = LANGCHAIN_IMPORT_STRING + DEFAULT_IMPORT_STRING
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Range specification for field types copied from langflow for lfx package."""
|
|
2
|
+
|
|
3
|
+
from typing import Literal
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, field_validator
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class RangeSpec(BaseModel):
|
|
9
|
+
step_type: Literal["int", "float"] = "float"
|
|
10
|
+
min: float = -1.0
|
|
11
|
+
max: float = 1.0
|
|
12
|
+
step: float = 0.1
|
|
13
|
+
|
|
14
|
+
@field_validator("max")
|
|
15
|
+
@classmethod
|
|
16
|
+
def max_must_be_greater_than_min(cls, v, values):
|
|
17
|
+
if "min" in values.data and v <= values.data["min"]:
|
|
18
|
+
msg = "Max must be greater than min"
|
|
19
|
+
raise ValueError(msg)
|
|
20
|
+
return v
|
|
21
|
+
|
|
22
|
+
@field_validator("step")
|
|
23
|
+
@classmethod
|
|
24
|
+
def step_must_be_positive(cls, v, values):
|
|
25
|
+
if v <= 0:
|
|
26
|
+
msg = "Step must be positive"
|
|
27
|
+
raise ValueError(msg)
|
|
28
|
+
if values.data["step_type"] == "int" and isinstance(v, float) and not v.is_integer():
|
|
29
|
+
msg = "When step_type is int, step must be an integer"
|
|
30
|
+
raise ValueError(msg)
|
|
31
|
+
return v
|
|
32
|
+
|
|
33
|
+
@classmethod
|
|
34
|
+
def set_step_type(cls, step_type: Literal["int", "float"], range_spec: "RangeSpec") -> "RangeSpec":
|
|
35
|
+
return cls(min=range_spec.min, max=range_spec.max, step=range_spec.step, step_type=step_type)
|
lfx/graph/__init__.py
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
from lfx.graph.edge.base import Edge
|
|
2
|
+
from lfx.graph.graph.base import Graph
|
|
3
|
+
from lfx.graph.vertex.base import Vertex
|
|
4
|
+
from lfx.graph.vertex.vertex_types import CustomComponentVertex, InterfaceVertex, StateVertex
|
|
5
|
+
|
|
6
|
+
__all__ = ["CustomComponentVertex", "Edge", "Graph", "InterfaceVertex", "StateVertex", "Vertex"]
|
|
File without changes
|
lfx/graph/edge/base.py
ADDED
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
4
|
+
|
|
5
|
+
from lfx.graph.edge.schema import EdgeData, LoopTargetHandleDict, SourceHandle, TargetHandle, TargetHandleDict
|
|
6
|
+
from lfx.log.logger import logger
|
|
7
|
+
from lfx.schema.schema import INPUT_FIELD_NAME
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from lfx.graph.vertex.base import Vertex
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Edge:
|
|
14
|
+
def __init__(self, source: Vertex, target: Vertex, edge: EdgeData):
|
|
15
|
+
self.source_id: str = source.id if source else ""
|
|
16
|
+
self.target_id: str = target.id if target else ""
|
|
17
|
+
self.valid_handles: bool = False
|
|
18
|
+
self.target_param: str | None = None
|
|
19
|
+
self._target_handle: TargetHandleDict | str | None = None
|
|
20
|
+
self._data = edge.copy()
|
|
21
|
+
self.is_cycle = False
|
|
22
|
+
if data := edge.get("data", {}):
|
|
23
|
+
self._source_handle = data.get("sourceHandle", {})
|
|
24
|
+
self._target_handle = cast("TargetHandleDict", data.get("targetHandle", {}))
|
|
25
|
+
self.source_handle: SourceHandle = SourceHandle(**self._source_handle)
|
|
26
|
+
if isinstance(self._target_handle, dict):
|
|
27
|
+
try:
|
|
28
|
+
if "name" in self._target_handle:
|
|
29
|
+
self.target_handle: TargetHandle = TargetHandle.from_loop_target_handle(
|
|
30
|
+
cast("LoopTargetHandleDict", self._target_handle)
|
|
31
|
+
)
|
|
32
|
+
else:
|
|
33
|
+
self.target_handle = TargetHandle(**self._target_handle)
|
|
34
|
+
except Exception as e:
|
|
35
|
+
if "inputTypes" in self._target_handle and self._target_handle["inputTypes"] is None:
|
|
36
|
+
# Check if self._target_handle['fieldName']
|
|
37
|
+
if hasattr(target, "custom_component"):
|
|
38
|
+
display_name = getattr(target.custom_component, "display_name", "")
|
|
39
|
+
msg = (
|
|
40
|
+
f"Component {display_name} field '{self._target_handle['fieldName']}' "
|
|
41
|
+
"might not be a valid input."
|
|
42
|
+
)
|
|
43
|
+
raise ValueError(msg) from e
|
|
44
|
+
msg = (
|
|
45
|
+
f"Field '{self._target_handle['fieldName']}' on {target.display_name} "
|
|
46
|
+
"might not be a valid input."
|
|
47
|
+
)
|
|
48
|
+
raise ValueError(msg) from e
|
|
49
|
+
raise
|
|
50
|
+
|
|
51
|
+
else:
|
|
52
|
+
msg = "Target handle is not a dictionary"
|
|
53
|
+
raise ValueError(msg)
|
|
54
|
+
self.target_param = self.target_handle.field_name
|
|
55
|
+
# validate handles
|
|
56
|
+
self.validate_handles(source, target)
|
|
57
|
+
else:
|
|
58
|
+
# Logging here because this is a breaking change
|
|
59
|
+
logger.error("Edge data is empty")
|
|
60
|
+
self._source_handle = edge.get("sourceHandle", "") # type: ignore[assignment]
|
|
61
|
+
self._target_handle = edge.get("targetHandle", "") # type: ignore[assignment]
|
|
62
|
+
# 'BaseLoader;BaseOutputParser|documents|PromptTemplate-zmTlD'
|
|
63
|
+
# target_param is documents
|
|
64
|
+
if isinstance(self._target_handle, str):
|
|
65
|
+
self.target_param = self._target_handle.split("|")[1]
|
|
66
|
+
self.source_handle = None # type: ignore[assignment]
|
|
67
|
+
self.target_handle = None # type: ignore[assignment]
|
|
68
|
+
else:
|
|
69
|
+
msg = "Target handle is not a string"
|
|
70
|
+
raise ValueError(msg)
|
|
71
|
+
# Validate in __init__ to fail fast
|
|
72
|
+
self.validate_edge(source, target)
|
|
73
|
+
|
|
74
|
+
def to_data(self):
|
|
75
|
+
return self._data
|
|
76
|
+
|
|
77
|
+
def validate_handles(self, source, target) -> None:
|
|
78
|
+
if isinstance(self._source_handle, str) or self.source_handle.base_classes:
|
|
79
|
+
self._legacy_validate_handles(source, target)
|
|
80
|
+
else:
|
|
81
|
+
self._validate_handles(source, target)
|
|
82
|
+
|
|
83
|
+
def _validate_handles(self, source, target) -> None:
|
|
84
|
+
if self.target_handle.input_types is None:
|
|
85
|
+
self.valid_handles = self.target_handle.type in self.source_handle.output_types
|
|
86
|
+
elif self.target_handle.type is None:
|
|
87
|
+
# ! This is not a good solution
|
|
88
|
+
# This is a loop edge
|
|
89
|
+
# If the target_handle.type is None, it means it's a loop edge
|
|
90
|
+
# and we should check if the source_handle.output_types is not empty
|
|
91
|
+
# and if the target_handle.input_types is empty or if any of the source_handle.output_types
|
|
92
|
+
# is in the target_handle.input_types
|
|
93
|
+
self.valid_handles = bool(self.source_handle.output_types) and (
|
|
94
|
+
not self.target_handle.input_types
|
|
95
|
+
or any(output_type in self.target_handle.input_types for output_type in self.source_handle.output_types)
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
elif self.source_handle.output_types is not None:
|
|
99
|
+
self.valid_handles = (
|
|
100
|
+
any(output_type in self.target_handle.input_types for output_type in self.source_handle.output_types)
|
|
101
|
+
or self.target_handle.type in self.source_handle.output_types
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
if not self.valid_handles:
|
|
105
|
+
logger.debug(self.source_handle)
|
|
106
|
+
logger.debug(self.target_handle)
|
|
107
|
+
msg = f"Edge between {source.display_name} and {target.display_name} has invalid handles"
|
|
108
|
+
raise ValueError(msg)
|
|
109
|
+
|
|
110
|
+
def _legacy_validate_handles(self, source, target) -> None:
|
|
111
|
+
if self.target_handle.input_types is None:
|
|
112
|
+
self.valid_handles = self.target_handle.type in self.source_handle.base_classes
|
|
113
|
+
else:
|
|
114
|
+
self.valid_handles = (
|
|
115
|
+
any(baseClass in self.target_handle.input_types for baseClass in self.source_handle.base_classes)
|
|
116
|
+
or self.target_handle.type in self.source_handle.base_classes
|
|
117
|
+
)
|
|
118
|
+
if not self.valid_handles:
|
|
119
|
+
logger.debug(self.source_handle)
|
|
120
|
+
logger.debug(self.target_handle)
|
|
121
|
+
msg = f"Edge between {source.vertex_type} and {target.vertex_type} has invalid handles"
|
|
122
|
+
raise ValueError(msg)
|
|
123
|
+
|
|
124
|
+
def __setstate__(self, state):
|
|
125
|
+
self.source_id = state["source_id"]
|
|
126
|
+
self.target_id = state["target_id"]
|
|
127
|
+
self.target_param = state["target_param"]
|
|
128
|
+
self.source_handle = state.get("source_handle")
|
|
129
|
+
self.target_handle = state.get("target_handle")
|
|
130
|
+
self._source_handle = state.get("_source_handle")
|
|
131
|
+
self._target_handle = state.get("_target_handle")
|
|
132
|
+
self._data = state.get("_data")
|
|
133
|
+
self.valid_handles = state.get("valid_handles")
|
|
134
|
+
self.source_types = state.get("source_types")
|
|
135
|
+
self.target_reqs = state.get("target_reqs")
|
|
136
|
+
self.matched_type = state.get("matched_type")
|
|
137
|
+
|
|
138
|
+
def validate_edge(self, source, target) -> None:
|
|
139
|
+
# If the self.source_handle has base_classes, then we are using the legacy
|
|
140
|
+
# way of defining the source and target handles
|
|
141
|
+
if isinstance(self._source_handle, str) or self.source_handle.base_classes:
|
|
142
|
+
self._legacy_validate_edge(source, target)
|
|
143
|
+
else:
|
|
144
|
+
self._validate_edge(source, target)
|
|
145
|
+
|
|
146
|
+
def _validate_edge(self, source, target) -> None:
|
|
147
|
+
# Validate that the outputs of the source node are valid inputs
|
|
148
|
+
# for the target node
|
|
149
|
+
# .outputs is a list of Output objects as dictionaries
|
|
150
|
+
# meaning: check for "types" key in each dictionary
|
|
151
|
+
self.source_types = [output for output in source.outputs if output["name"] == self.source_handle.name]
|
|
152
|
+
|
|
153
|
+
# Check if this is an loop input (loop target handle with output_types)
|
|
154
|
+
is_loop_input = hasattr(self.target_handle, "input_types") and self.target_handle.input_types
|
|
155
|
+
loop_input_types = []
|
|
156
|
+
|
|
157
|
+
if is_loop_input:
|
|
158
|
+
# For loop inputs, use the configured input_types
|
|
159
|
+
# (which already includes original type + loop_types from frontend)
|
|
160
|
+
loop_input_types = list(self.target_handle.input_types)
|
|
161
|
+
self.valid = any(
|
|
162
|
+
any(output_type in loop_input_types for output_type in output["types"]) for output in self.source_types
|
|
163
|
+
)
|
|
164
|
+
# Find the first matching type
|
|
165
|
+
self.matched_type = next(
|
|
166
|
+
(
|
|
167
|
+
output_type
|
|
168
|
+
for output in self.source_types
|
|
169
|
+
for output_type in output["types"]
|
|
170
|
+
if output_type in loop_input_types
|
|
171
|
+
),
|
|
172
|
+
None,
|
|
173
|
+
)
|
|
174
|
+
else:
|
|
175
|
+
# Standard validation for regular inputs
|
|
176
|
+
self.target_reqs = target.required_inputs + target.optional_inputs
|
|
177
|
+
# Both lists contain strings and sometimes a string contains the value we are
|
|
178
|
+
# looking for e.g. comgin_out=["Chain"] and target_reqs=["LLMChain"]
|
|
179
|
+
# so we need to check if any of the strings in source_types is in target_reqs
|
|
180
|
+
self.valid = any(
|
|
181
|
+
any(output_type in target_req for output_type in output["types"])
|
|
182
|
+
for output in self.source_types
|
|
183
|
+
for target_req in self.target_reqs
|
|
184
|
+
)
|
|
185
|
+
# Update the matched type to be the first found match
|
|
186
|
+
self.matched_type = next(
|
|
187
|
+
(
|
|
188
|
+
output_type
|
|
189
|
+
for output in self.source_types
|
|
190
|
+
for output_type in output["types"]
|
|
191
|
+
for target_req in self.target_reqs
|
|
192
|
+
if output_type in target_req
|
|
193
|
+
),
|
|
194
|
+
None,
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
no_matched_type = self.matched_type is None
|
|
198
|
+
if no_matched_type:
|
|
199
|
+
logger.debug(self.source_types)
|
|
200
|
+
logger.debug(self.target_reqs if not is_loop_input else loop_input_types)
|
|
201
|
+
msg = f"Edge between {source.vertex_type} and {target.vertex_type} has no matched type."
|
|
202
|
+
raise ValueError(msg)
|
|
203
|
+
|
|
204
|
+
def _legacy_validate_edge(self, source, target) -> None:
|
|
205
|
+
# Validate that the outputs of the source node are valid inputs
|
|
206
|
+
# for the target node
|
|
207
|
+
self.source_types = source.output
|
|
208
|
+
self.target_reqs = target.required_inputs + target.optional_inputs
|
|
209
|
+
# Both lists contain strings and sometimes a string contains the value we are
|
|
210
|
+
# looking for e.g. comgin_out=["Chain"] and target_reqs=["LLMChain"]
|
|
211
|
+
# so we need to check if any of the strings in source_types is in target_reqs
|
|
212
|
+
self.valid = any(output in target_req for output in self.source_types for target_req in self.target_reqs)
|
|
213
|
+
# Get what type of input the target node is expecting
|
|
214
|
+
|
|
215
|
+
self.matched_type = next(
|
|
216
|
+
(output for output in self.source_types if output in self.target_reqs),
|
|
217
|
+
None,
|
|
218
|
+
)
|
|
219
|
+
no_matched_type = self.matched_type is None
|
|
220
|
+
if no_matched_type:
|
|
221
|
+
logger.debug(self.source_types)
|
|
222
|
+
logger.debug(self.target_reqs)
|
|
223
|
+
msg = f"Edge between {source.vertex_type} and {target.vertex_type} has no matched type"
|
|
224
|
+
raise ValueError(msg)
|
|
225
|
+
|
|
226
|
+
def __repr__(self) -> str:
|
|
227
|
+
if (hasattr(self, "source_handle") and self.source_handle) and (
|
|
228
|
+
hasattr(self, "target_handle") and self.target_handle
|
|
229
|
+
):
|
|
230
|
+
return f"{self.source_id} -[{self.source_handle.name}->{self.target_handle.field_name}]-> {self.target_id}"
|
|
231
|
+
return f"{self.source_id} -[{self.target_param}]-> {self.target_id}"
|
|
232
|
+
|
|
233
|
+
def __hash__(self) -> int:
|
|
234
|
+
return hash(self.__repr__())
|
|
235
|
+
|
|
236
|
+
def __eq__(self, /, other: object) -> bool:
|
|
237
|
+
if not isinstance(other, Edge):
|
|
238
|
+
return False
|
|
239
|
+
return (
|
|
240
|
+
self._source_handle == other._source_handle
|
|
241
|
+
and self._target_handle == other._target_handle
|
|
242
|
+
and self.target_param == other.target_param
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
def __str__(self) -> str:
|
|
246
|
+
return self.__repr__()
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
class CycleEdge(Edge):
|
|
250
|
+
def __init__(self, source: Vertex, target: Vertex, raw_edge: EdgeData):
|
|
251
|
+
super().__init__(source, target, raw_edge)
|
|
252
|
+
self.is_fulfilled = False # Whether the contract has been fulfilled.
|
|
253
|
+
self.result: Any = None
|
|
254
|
+
self.is_cycle = True
|
|
255
|
+
source.has_cycle_edges = True
|
|
256
|
+
target.has_cycle_edges = True
|
|
257
|
+
|
|
258
|
+
async def honor(self, source: Vertex, target: Vertex) -> None:
|
|
259
|
+
"""Fulfills the contract by setting the result of the source vertex to the target vertex's parameter.
|
|
260
|
+
|
|
261
|
+
If the edge is runnable, the source vertex is run with the message text and the target vertex's
|
|
262
|
+
root_field param is set to the
|
|
263
|
+
result. If the edge is not runnable, the target vertex's parameter is set to the result.
|
|
264
|
+
:param message: The message object to be processed if the edge is runnable.
|
|
265
|
+
"""
|
|
266
|
+
if self.is_fulfilled:
|
|
267
|
+
return
|
|
268
|
+
|
|
269
|
+
if not source.built:
|
|
270
|
+
# The system should be read-only, so we should not be building vertices
|
|
271
|
+
# that are not already built.
|
|
272
|
+
msg = f"Source vertex {source.id} is not built."
|
|
273
|
+
raise ValueError(msg)
|
|
274
|
+
|
|
275
|
+
if self.matched_type == "Text":
|
|
276
|
+
self.result = source.built_result
|
|
277
|
+
else:
|
|
278
|
+
self.result = source.built_object
|
|
279
|
+
|
|
280
|
+
target.params[self.target_param] = self.result
|
|
281
|
+
self.is_fulfilled = True
|
|
282
|
+
|
|
283
|
+
async def get_result_from_source(self, source: Vertex, target: Vertex):
|
|
284
|
+
# Fulfill the contract if it has not been fulfilled.
|
|
285
|
+
if not self.is_fulfilled:
|
|
286
|
+
await self.honor(source, target)
|
|
287
|
+
|
|
288
|
+
# If the target vertex is a power component we log messages
|
|
289
|
+
if (
|
|
290
|
+
target.vertex_type == "ChatOutput"
|
|
291
|
+
and isinstance(target.params.get(INPUT_FIELD_NAME), str | dict)
|
|
292
|
+
and target.params.get("message") == ""
|
|
293
|
+
):
|
|
294
|
+
return self.result
|
|
295
|
+
return self.result
|
|
296
|
+
|
|
297
|
+
def __repr__(self) -> str:
|
|
298
|
+
str_repr = super().__repr__()
|
|
299
|
+
# Add a symbol to show this is a cycle edge
|
|
300
|
+
return f"{str_repr} 🔄"
|