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
lfx/base/__init__.py
ADDED
|
File without changes
|
|
File without changes
|
lfx/base/agents/agent.py
ADDED
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import uuid
|
|
3
|
+
from abc import abstractmethod
|
|
4
|
+
from typing import TYPE_CHECKING, cast
|
|
5
|
+
|
|
6
|
+
from langchain.agents import AgentExecutor, BaseMultiActionAgent, BaseSingleActionAgent
|
|
7
|
+
from langchain.agents.agent import RunnableAgent
|
|
8
|
+
from langchain.callbacks.base import BaseCallbackHandler
|
|
9
|
+
from langchain_core.messages import BaseMessage, HumanMessage
|
|
10
|
+
from langchain_core.runnables import Runnable
|
|
11
|
+
|
|
12
|
+
from lfx.base.agents.callback import AgentAsyncHandler
|
|
13
|
+
from lfx.base.agents.events import ExceptionWithMessageError, process_agent_events
|
|
14
|
+
from lfx.base.agents.utils import get_chat_output_sender_name
|
|
15
|
+
from lfx.custom.custom_component.component import Component, _get_component_toolkit
|
|
16
|
+
from lfx.field_typing import Tool
|
|
17
|
+
from lfx.inputs.inputs import InputTypes, MultilineInput
|
|
18
|
+
from lfx.io import BoolInput, HandleInput, IntInput, MessageInput
|
|
19
|
+
from lfx.log.logger import logger
|
|
20
|
+
from lfx.memory import delete_message
|
|
21
|
+
from lfx.schema.content_block import ContentBlock
|
|
22
|
+
from lfx.schema.data import Data
|
|
23
|
+
from lfx.schema.log import OnTokenFunctionType
|
|
24
|
+
from lfx.schema.message import Message
|
|
25
|
+
from lfx.template.field.base import Output
|
|
26
|
+
from lfx.utils.constants import MESSAGE_SENDER_AI
|
|
27
|
+
|
|
28
|
+
if TYPE_CHECKING:
|
|
29
|
+
from lfx.schema.log import OnTokenFunctionType, SendMessageFunctionType
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
DEFAULT_TOOLS_DESCRIPTION = "A helpful assistant with access to the following tools:"
|
|
33
|
+
DEFAULT_AGENT_NAME = "Agent ({tools_names})"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class LCAgentComponent(Component):
|
|
37
|
+
trace_type = "agent"
|
|
38
|
+
_base_inputs: list[InputTypes] = [
|
|
39
|
+
MessageInput(
|
|
40
|
+
name="input_value",
|
|
41
|
+
display_name="Input",
|
|
42
|
+
info="The input provided by the user for the agent to process.",
|
|
43
|
+
tool_mode=True,
|
|
44
|
+
),
|
|
45
|
+
BoolInput(
|
|
46
|
+
name="handle_parsing_errors",
|
|
47
|
+
display_name="Handle Parse Errors",
|
|
48
|
+
value=True,
|
|
49
|
+
advanced=True,
|
|
50
|
+
info="Should the Agent fix errors when reading user input for better processing?",
|
|
51
|
+
),
|
|
52
|
+
BoolInput(name="verbose", display_name="Verbose", value=True, advanced=True),
|
|
53
|
+
IntInput(
|
|
54
|
+
name="max_iterations",
|
|
55
|
+
display_name="Max Iterations",
|
|
56
|
+
value=15,
|
|
57
|
+
advanced=True,
|
|
58
|
+
info="The maximum number of attempts the agent can make to complete its task before it stops.",
|
|
59
|
+
),
|
|
60
|
+
MultilineInput(
|
|
61
|
+
name="agent_description",
|
|
62
|
+
display_name="Agent Description [Deprecated]",
|
|
63
|
+
info=(
|
|
64
|
+
"The description of the agent. This is only used when in Tool Mode. "
|
|
65
|
+
f"Defaults to '{DEFAULT_TOOLS_DESCRIPTION}' and tools are added dynamically. "
|
|
66
|
+
"This feature is deprecated and will be removed in future versions."
|
|
67
|
+
),
|
|
68
|
+
advanced=True,
|
|
69
|
+
value=DEFAULT_TOOLS_DESCRIPTION,
|
|
70
|
+
),
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
outputs = [
|
|
74
|
+
Output(display_name="Agent", name="agent", method="build_agent", hidden=True, tool_mode=False),
|
|
75
|
+
Output(display_name="Response", name="response", method="message_response"),
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
# Get shared callbacks for tracing and save them to self.shared_callbacks
|
|
79
|
+
def _get_shared_callbacks(self) -> list[BaseCallbackHandler]:
|
|
80
|
+
if not hasattr(self, "shared_callbacks"):
|
|
81
|
+
self.shared_callbacks = self.get_langchain_callbacks()
|
|
82
|
+
return self.shared_callbacks
|
|
83
|
+
|
|
84
|
+
@abstractmethod
|
|
85
|
+
def build_agent(self) -> AgentExecutor:
|
|
86
|
+
"""Create the agent."""
|
|
87
|
+
|
|
88
|
+
async def message_response(self) -> Message:
|
|
89
|
+
"""Run the agent and return the response."""
|
|
90
|
+
agent = self.build_agent()
|
|
91
|
+
message = await self.run_agent(agent=agent)
|
|
92
|
+
|
|
93
|
+
self.status = message
|
|
94
|
+
return message
|
|
95
|
+
|
|
96
|
+
def _validate_outputs(self) -> None:
|
|
97
|
+
required_output_methods = ["build_agent"]
|
|
98
|
+
output_names = [output.name for output in self.outputs]
|
|
99
|
+
for method_name in required_output_methods:
|
|
100
|
+
if method_name not in output_names:
|
|
101
|
+
msg = f"Output with name '{method_name}' must be defined."
|
|
102
|
+
raise ValueError(msg)
|
|
103
|
+
if not hasattr(self, method_name):
|
|
104
|
+
msg = f"Method '{method_name}' must be defined."
|
|
105
|
+
raise ValueError(msg)
|
|
106
|
+
|
|
107
|
+
def get_agent_kwargs(self, *, flatten: bool = False) -> dict:
|
|
108
|
+
base = {
|
|
109
|
+
"handle_parsing_errors": self.handle_parsing_errors,
|
|
110
|
+
"verbose": self.verbose,
|
|
111
|
+
"allow_dangerous_code": True,
|
|
112
|
+
}
|
|
113
|
+
agent_kwargs = {
|
|
114
|
+
"handle_parsing_errors": self.handle_parsing_errors,
|
|
115
|
+
"max_iterations": self.max_iterations,
|
|
116
|
+
}
|
|
117
|
+
if flatten:
|
|
118
|
+
return {
|
|
119
|
+
**base,
|
|
120
|
+
**agent_kwargs,
|
|
121
|
+
}
|
|
122
|
+
return {**base, "agent_executor_kwargs": agent_kwargs}
|
|
123
|
+
|
|
124
|
+
def get_chat_history_data(self) -> list[Data] | None:
|
|
125
|
+
# might be overridden in subclasses
|
|
126
|
+
return None
|
|
127
|
+
|
|
128
|
+
def _data_to_messages_skip_empty(self, data: list[Data]) -> list[BaseMessage]:
|
|
129
|
+
"""Convert data to messages, filtering only empty text while preserving non-text content.
|
|
130
|
+
|
|
131
|
+
Note: added to fix issue with certain providers failing when given empty text as input.
|
|
132
|
+
"""
|
|
133
|
+
messages = []
|
|
134
|
+
for value in data:
|
|
135
|
+
# Only skip if the message has a text attribute that is empty/whitespace
|
|
136
|
+
text = getattr(value, "text", None)
|
|
137
|
+
if isinstance(text, str) and not text.strip():
|
|
138
|
+
# Skip only messages with empty/whitespace-only text strings
|
|
139
|
+
continue
|
|
140
|
+
|
|
141
|
+
lc_message = value.to_lc_message()
|
|
142
|
+
messages.append(lc_message)
|
|
143
|
+
|
|
144
|
+
return messages
|
|
145
|
+
|
|
146
|
+
async def run_agent(
|
|
147
|
+
self,
|
|
148
|
+
agent: Runnable | BaseSingleActionAgent | BaseMultiActionAgent | AgentExecutor,
|
|
149
|
+
) -> Message:
|
|
150
|
+
if isinstance(agent, AgentExecutor):
|
|
151
|
+
runnable = agent
|
|
152
|
+
else:
|
|
153
|
+
# note the tools are not required to run the agent, hence the validation removed.
|
|
154
|
+
handle_parsing_errors = hasattr(self, "handle_parsing_errors") and self.handle_parsing_errors
|
|
155
|
+
verbose = hasattr(self, "verbose") and self.verbose
|
|
156
|
+
max_iterations = hasattr(self, "max_iterations") and self.max_iterations
|
|
157
|
+
runnable = AgentExecutor.from_agent_and_tools(
|
|
158
|
+
agent=agent,
|
|
159
|
+
tools=self.tools or [],
|
|
160
|
+
handle_parsing_errors=handle_parsing_errors,
|
|
161
|
+
verbose=verbose,
|
|
162
|
+
max_iterations=max_iterations,
|
|
163
|
+
)
|
|
164
|
+
# Convert input_value to proper format for agent
|
|
165
|
+
lc_message = None
|
|
166
|
+
if isinstance(self.input_value, Message):
|
|
167
|
+
lc_message = self.input_value.to_lc_message()
|
|
168
|
+
# Extract text content from the LangChain message for agent input
|
|
169
|
+
# Agents expect a string input, not a Message object
|
|
170
|
+
if hasattr(lc_message, "content"):
|
|
171
|
+
if isinstance(lc_message.content, str):
|
|
172
|
+
input_dict: dict[str, str | list[BaseMessage] | BaseMessage] = {"input": lc_message.content}
|
|
173
|
+
elif isinstance(lc_message.content, list):
|
|
174
|
+
# For multimodal content, extract text parts
|
|
175
|
+
text_parts = [item.get("text", "") for item in lc_message.content if item.get("type") == "text"]
|
|
176
|
+
input_dict = {"input": " ".join(text_parts) if text_parts else ""}
|
|
177
|
+
else:
|
|
178
|
+
input_dict = {"input": str(lc_message.content)}
|
|
179
|
+
else:
|
|
180
|
+
input_dict = {"input": str(lc_message)}
|
|
181
|
+
else:
|
|
182
|
+
input_dict = {"input": self.input_value}
|
|
183
|
+
|
|
184
|
+
if hasattr(self, "system_prompt"):
|
|
185
|
+
input_dict["system_prompt"] = self.system_prompt
|
|
186
|
+
|
|
187
|
+
if hasattr(self, "chat_history") and self.chat_history:
|
|
188
|
+
if isinstance(self.chat_history, Data):
|
|
189
|
+
input_dict["chat_history"] = self._data_to_messages_skip_empty([self.chat_history])
|
|
190
|
+
elif all(hasattr(m, "to_data") and callable(m.to_data) and "text" in m.data for m in self.chat_history):
|
|
191
|
+
input_dict["chat_history"] = self._data_to_messages_skip_empty(self.chat_history)
|
|
192
|
+
elif all(isinstance(m, Message) for m in self.chat_history):
|
|
193
|
+
input_dict["chat_history"] = self._data_to_messages_skip_empty([m.to_data() for m in self.chat_history])
|
|
194
|
+
|
|
195
|
+
# Handle multimodal input (images + text)
|
|
196
|
+
# Note: Agent input must be a string, so we extract text and move images to chat_history
|
|
197
|
+
if lc_message is not None and hasattr(lc_message, "content") and isinstance(lc_message.content, list):
|
|
198
|
+
# Extract images and text from the text content items
|
|
199
|
+
image_dicts = [item for item in lc_message.content if item.get("type") == "image"]
|
|
200
|
+
text_content = [item for item in lc_message.content if item.get("type") != "image"]
|
|
201
|
+
|
|
202
|
+
text_strings = [
|
|
203
|
+
item.get("text", "")
|
|
204
|
+
for item in text_content
|
|
205
|
+
if item.get("type") == "text" and item.get("text", "").strip()
|
|
206
|
+
]
|
|
207
|
+
|
|
208
|
+
# Set input to concatenated text or empty string
|
|
209
|
+
input_dict["input"] = " ".join(text_strings) if text_strings else ""
|
|
210
|
+
|
|
211
|
+
# If input is still a list or empty, provide a default
|
|
212
|
+
if isinstance(input_dict["input"], list) or not input_dict["input"]:
|
|
213
|
+
input_dict["input"] = "Process the provided images."
|
|
214
|
+
|
|
215
|
+
if "chat_history" not in input_dict:
|
|
216
|
+
input_dict["chat_history"] = []
|
|
217
|
+
|
|
218
|
+
if isinstance(input_dict["chat_history"], list):
|
|
219
|
+
input_dict["chat_history"].extend(HumanMessage(content=[image_dict]) for image_dict in image_dicts)
|
|
220
|
+
else:
|
|
221
|
+
input_dict["chat_history"] = [HumanMessage(content=[image_dict]) for image_dict in image_dicts]
|
|
222
|
+
|
|
223
|
+
# Final safety check: ensure input is never empty (prevents Anthropic API errors)
|
|
224
|
+
current_input = input_dict.get("input", "")
|
|
225
|
+
if isinstance(current_input, list):
|
|
226
|
+
current_input = " ".join(map(str, current_input))
|
|
227
|
+
elif not isinstance(current_input, str):
|
|
228
|
+
current_input = str(current_input)
|
|
229
|
+
|
|
230
|
+
if not current_input.strip():
|
|
231
|
+
input_dict["input"] = "Continue the conversation."
|
|
232
|
+
else:
|
|
233
|
+
input_dict["input"] = current_input
|
|
234
|
+
|
|
235
|
+
if hasattr(self, "graph"):
|
|
236
|
+
session_id = self.graph.session_id
|
|
237
|
+
elif hasattr(self, "_session_id"):
|
|
238
|
+
session_id = self._session_id
|
|
239
|
+
else:
|
|
240
|
+
session_id = None
|
|
241
|
+
|
|
242
|
+
sender_name = get_chat_output_sender_name(self) or self.display_name or "AI"
|
|
243
|
+
agent_message = Message(
|
|
244
|
+
sender=MESSAGE_SENDER_AI,
|
|
245
|
+
sender_name=sender_name,
|
|
246
|
+
properties={"icon": "Bot", "state": "partial"},
|
|
247
|
+
content_blocks=[ContentBlock(title="Agent Steps", contents=[])],
|
|
248
|
+
session_id=session_id or uuid.uuid4(),
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
# Create token callback if event_manager is available
|
|
252
|
+
# This wraps the event_manager's on_token method to match OnTokenFunctionType Protocol
|
|
253
|
+
on_token_callback: OnTokenFunctionType | None = None
|
|
254
|
+
if self._event_manager:
|
|
255
|
+
on_token_callback = cast("OnTokenFunctionType", self._event_manager.on_token)
|
|
256
|
+
|
|
257
|
+
try:
|
|
258
|
+
result = await process_agent_events(
|
|
259
|
+
runnable.astream_events(
|
|
260
|
+
input_dict,
|
|
261
|
+
# here we use the shared callbacks because the AgentExecutor uses the tools
|
|
262
|
+
config={"callbacks": [AgentAsyncHandler(self.log), *self._get_shared_callbacks()]},
|
|
263
|
+
version="v2",
|
|
264
|
+
),
|
|
265
|
+
agent_message,
|
|
266
|
+
cast("SendMessageFunctionType", self.send_message),
|
|
267
|
+
on_token_callback,
|
|
268
|
+
)
|
|
269
|
+
except ExceptionWithMessageError as e:
|
|
270
|
+
if hasattr(e, "agent_message") and hasattr(e.agent_message, "id"):
|
|
271
|
+
msg_id = e.agent_message.id
|
|
272
|
+
await delete_message(id_=msg_id)
|
|
273
|
+
await self._send_message_event(e.agent_message, category="remove_message")
|
|
274
|
+
logger.error(f"ExceptionWithMessageError: {e}")
|
|
275
|
+
raise
|
|
276
|
+
except Exception as e:
|
|
277
|
+
# Log or handle any other exceptions
|
|
278
|
+
logger.error(f"Error: {e}")
|
|
279
|
+
raise
|
|
280
|
+
|
|
281
|
+
self.status = result
|
|
282
|
+
return result
|
|
283
|
+
|
|
284
|
+
@abstractmethod
|
|
285
|
+
def create_agent_runnable(self) -> Runnable:
|
|
286
|
+
"""Create the agent."""
|
|
287
|
+
|
|
288
|
+
def validate_tool_names(self) -> None:
|
|
289
|
+
"""Validate tool names to ensure they match the required pattern."""
|
|
290
|
+
pattern = re.compile(r"^[a-zA-Z0-9_-]+$")
|
|
291
|
+
if hasattr(self, "tools") and self.tools:
|
|
292
|
+
for tool in self.tools:
|
|
293
|
+
if not pattern.match(tool.name):
|
|
294
|
+
msg = (
|
|
295
|
+
f"Invalid tool name '{tool.name}': must only contain letters, numbers, underscores, dashes,"
|
|
296
|
+
" and cannot contain spaces."
|
|
297
|
+
)
|
|
298
|
+
raise ValueError(msg)
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
class LCToolsAgentComponent(LCAgentComponent):
|
|
302
|
+
_base_inputs = [
|
|
303
|
+
HandleInput(
|
|
304
|
+
name="tools",
|
|
305
|
+
display_name="Tools",
|
|
306
|
+
input_types=["Tool"],
|
|
307
|
+
is_list=True,
|
|
308
|
+
required=False,
|
|
309
|
+
info="These are the tools that the agent can use to help with tasks.",
|
|
310
|
+
),
|
|
311
|
+
*LCAgentComponent.get_base_inputs(),
|
|
312
|
+
]
|
|
313
|
+
|
|
314
|
+
def build_agent(self) -> AgentExecutor:
|
|
315
|
+
self.validate_tool_names()
|
|
316
|
+
agent = self.create_agent_runnable()
|
|
317
|
+
return AgentExecutor.from_agent_and_tools(
|
|
318
|
+
agent=RunnableAgent(runnable=agent, input_keys_arg=["input"], return_keys_arg=["output"]),
|
|
319
|
+
tools=self.tools,
|
|
320
|
+
**self.get_agent_kwargs(flatten=True),
|
|
321
|
+
)
|
|
322
|
+
|
|
323
|
+
@abstractmethod
|
|
324
|
+
def create_agent_runnable(self) -> Runnable:
|
|
325
|
+
"""Create the agent."""
|
|
326
|
+
|
|
327
|
+
def get_tool_name(self) -> str:
|
|
328
|
+
return self.display_name or "Agent"
|
|
329
|
+
|
|
330
|
+
def get_tool_description(self) -> str:
|
|
331
|
+
return self.agent_description or DEFAULT_TOOLS_DESCRIPTION
|
|
332
|
+
|
|
333
|
+
def _build_tools_names(self):
|
|
334
|
+
tools_names = ""
|
|
335
|
+
if self.tools:
|
|
336
|
+
tools_names = ", ".join([tool.name for tool in self.tools])
|
|
337
|
+
return tools_names
|
|
338
|
+
|
|
339
|
+
# Set shared callbacks for tracing
|
|
340
|
+
def set_tools_callbacks(self, tools_list: list[Tool], callbacks_list: list[BaseCallbackHandler]):
|
|
341
|
+
"""Set shared callbacks for tracing to the tools.
|
|
342
|
+
|
|
343
|
+
If we do not pass down the same callbacks to each tool
|
|
344
|
+
used by the agent, then each tool will instantiate a new callback.
|
|
345
|
+
For some tracing services, this will cause
|
|
346
|
+
the callback handler to lose the id of its parent run (Agent)
|
|
347
|
+
and thus throw an error in the tracing service client.
|
|
348
|
+
|
|
349
|
+
Args:
|
|
350
|
+
tools_list: list of tools to set the callbacks for
|
|
351
|
+
callbacks_list: list of callbacks to set for the tools
|
|
352
|
+
Returns:
|
|
353
|
+
None
|
|
354
|
+
"""
|
|
355
|
+
for tool in tools_list or []:
|
|
356
|
+
if hasattr(tool, "callbacks"):
|
|
357
|
+
tool.callbacks = callbacks_list
|
|
358
|
+
|
|
359
|
+
async def _get_tools(self) -> list[Tool]:
|
|
360
|
+
component_toolkit = _get_component_toolkit()
|
|
361
|
+
tools_names = self._build_tools_names()
|
|
362
|
+
agent_description = self.get_tool_description()
|
|
363
|
+
# TODO: Agent Description Depreciated Feature to be removed
|
|
364
|
+
description = f"{agent_description}{tools_names}"
|
|
365
|
+
|
|
366
|
+
tools = component_toolkit(component=self).get_tools(
|
|
367
|
+
tool_name=self.get_tool_name(),
|
|
368
|
+
tool_description=description,
|
|
369
|
+
# here we do not use the shared callbacks as we are exposing the agent as a tool
|
|
370
|
+
callbacks=self.get_langchain_callbacks(),
|
|
371
|
+
)
|
|
372
|
+
if hasattr(self, "tools_metadata"):
|
|
373
|
+
tools = component_toolkit(component=self, metadata=self.tools_metadata).update_tools_metadata(tools=tools)
|
|
374
|
+
|
|
375
|
+
return tools
|