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,15 @@
|
|
|
1
|
+
from .extract_key_from_data import ExtractKeyFromDataComponent
|
|
2
|
+
from .list_flows import ListFlowsComponent
|
|
3
|
+
from .merge_data import MergeDataComponent
|
|
4
|
+
from .selective_passthrough import SelectivePassThroughComponent
|
|
5
|
+
from .split_text import SplitTextComponent
|
|
6
|
+
from .sub_flow import SubFlowComponent
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
"ExtractKeyFromDataComponent",
|
|
10
|
+
"ListFlowsComponent",
|
|
11
|
+
"MergeDataComponent",
|
|
12
|
+
"SelectivePassThroughComponent",
|
|
13
|
+
"SplitTextComponent",
|
|
14
|
+
"SubFlowComponent",
|
|
15
|
+
]
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# mypy: disable-error-code="attr-defined"
|
|
2
|
+
from langchain_community.retrievers import AmazonKendraRetriever
|
|
3
|
+
|
|
4
|
+
from lfx.base.vectorstores.model import check_cached_vector_store
|
|
5
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
|
6
|
+
from lfx.io import DictInput, IntInput, StrInput
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class AmazonKendraRetrieverComponent(CustomComponent):
|
|
10
|
+
display_name: str = "Amazon Kendra Retriever"
|
|
11
|
+
description: str = "Retriever that uses the Amazon Kendra API."
|
|
12
|
+
name = "AmazonKendra"
|
|
13
|
+
icon = "Amazon"
|
|
14
|
+
legacy = True
|
|
15
|
+
|
|
16
|
+
inputs = [
|
|
17
|
+
StrInput(
|
|
18
|
+
name="index_id",
|
|
19
|
+
display_name="Index ID",
|
|
20
|
+
),
|
|
21
|
+
StrInput(
|
|
22
|
+
name="region_name",
|
|
23
|
+
display_name="Region Name",
|
|
24
|
+
),
|
|
25
|
+
StrInput(
|
|
26
|
+
name="credentials_profile_name",
|
|
27
|
+
display_name="Credentials Profile Name",
|
|
28
|
+
),
|
|
29
|
+
DictInput(
|
|
30
|
+
name="attribute_filter",
|
|
31
|
+
display_name="Attribute Filter",
|
|
32
|
+
),
|
|
33
|
+
IntInput(
|
|
34
|
+
name="top_k",
|
|
35
|
+
display_name="Top K",
|
|
36
|
+
value=3,
|
|
37
|
+
),
|
|
38
|
+
DictInput(
|
|
39
|
+
name="user_context",
|
|
40
|
+
display_name="User Context",
|
|
41
|
+
),
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
@check_cached_vector_store
|
|
45
|
+
def build_vector_store(self) -> AmazonKendraRetriever:
|
|
46
|
+
"""Builds the Amazon Kendra Retriever."""
|
|
47
|
+
try:
|
|
48
|
+
from langchain_community.retrievers import AmazonKendraRetriever
|
|
49
|
+
except ImportError as e:
|
|
50
|
+
msg = "Could not import AmazonKendraRetriever. Please install it with `pip install langchain-community`."
|
|
51
|
+
raise ImportError(msg) from e
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
output = AmazonKendraRetriever(
|
|
55
|
+
index_id=self.index_id,
|
|
56
|
+
top_k=self.top_k,
|
|
57
|
+
region_name=self.region_name,
|
|
58
|
+
credentials_profile_name=self.credentials_profile_name,
|
|
59
|
+
attribute_filter=self.attribute_filter,
|
|
60
|
+
user_context=self.user_context,
|
|
61
|
+
)
|
|
62
|
+
except Exception as e:
|
|
63
|
+
msg = "Could not connect to AmazonKendra API."
|
|
64
|
+
raise ValueError(msg) from e
|
|
65
|
+
|
|
66
|
+
return output
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
from langchain_community.chat_models.litellm import ChatLiteLLM, ChatLiteLLMException
|
|
2
|
+
|
|
3
|
+
from lfx.base.constants import STREAM_INFO_TEXT
|
|
4
|
+
from lfx.base.models.model import LCModelComponent
|
|
5
|
+
from lfx.field_typing import LanguageModel
|
|
6
|
+
from lfx.io import (
|
|
7
|
+
BoolInput,
|
|
8
|
+
DictInput,
|
|
9
|
+
DropdownInput,
|
|
10
|
+
FloatInput,
|
|
11
|
+
IntInput,
|
|
12
|
+
MessageInput,
|
|
13
|
+
SecretStrInput,
|
|
14
|
+
StrInput,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ChatLiteLLMModelComponent(LCModelComponent):
|
|
19
|
+
display_name = "LiteLLM"
|
|
20
|
+
description = "`LiteLLM` collection of large language models."
|
|
21
|
+
documentation = "https://python.langchain.com/docs/integrations/chat/litellm"
|
|
22
|
+
icon = "🚄"
|
|
23
|
+
|
|
24
|
+
inputs = [
|
|
25
|
+
MessageInput(name="input_value", display_name="Input"),
|
|
26
|
+
StrInput(
|
|
27
|
+
name="model",
|
|
28
|
+
display_name="Model name",
|
|
29
|
+
advanced=False,
|
|
30
|
+
required=True,
|
|
31
|
+
info="The name of the model to use. For example, `gpt-3.5-turbo`.",
|
|
32
|
+
),
|
|
33
|
+
SecretStrInput(
|
|
34
|
+
name="api_key",
|
|
35
|
+
display_name="Chat LiteLLM API Key",
|
|
36
|
+
advanced=False,
|
|
37
|
+
required=False,
|
|
38
|
+
),
|
|
39
|
+
DropdownInput(
|
|
40
|
+
name="provider",
|
|
41
|
+
display_name="Provider",
|
|
42
|
+
info="The provider of the API key.",
|
|
43
|
+
options=[
|
|
44
|
+
"OpenAI",
|
|
45
|
+
"Azure",
|
|
46
|
+
"Anthropic",
|
|
47
|
+
"Replicate",
|
|
48
|
+
"Cohere",
|
|
49
|
+
"OpenRouter",
|
|
50
|
+
],
|
|
51
|
+
),
|
|
52
|
+
FloatInput(
|
|
53
|
+
name="temperature",
|
|
54
|
+
display_name="Temperature",
|
|
55
|
+
advanced=False,
|
|
56
|
+
required=False,
|
|
57
|
+
value=0.7,
|
|
58
|
+
),
|
|
59
|
+
DictInput(
|
|
60
|
+
name="kwargs",
|
|
61
|
+
display_name="Kwargs",
|
|
62
|
+
advanced=True,
|
|
63
|
+
required=False,
|
|
64
|
+
is_list=True,
|
|
65
|
+
value={},
|
|
66
|
+
),
|
|
67
|
+
DictInput(
|
|
68
|
+
name="model_kwargs",
|
|
69
|
+
display_name="Model kwargs",
|
|
70
|
+
advanced=True,
|
|
71
|
+
required=False,
|
|
72
|
+
is_list=True,
|
|
73
|
+
value={},
|
|
74
|
+
),
|
|
75
|
+
FloatInput(name="top_p", display_name="Top p", advanced=True, required=False, value=0.5),
|
|
76
|
+
IntInput(name="top_k", display_name="Top k", advanced=True, required=False, value=35),
|
|
77
|
+
IntInput(
|
|
78
|
+
name="n",
|
|
79
|
+
display_name="N",
|
|
80
|
+
advanced=True,
|
|
81
|
+
required=False,
|
|
82
|
+
info="Number of chat completions to generate for each prompt. "
|
|
83
|
+
"Note that the API may not return the full n completions if duplicates are generated.",
|
|
84
|
+
value=1,
|
|
85
|
+
),
|
|
86
|
+
IntInput(
|
|
87
|
+
name="max_tokens",
|
|
88
|
+
display_name="Max tokens",
|
|
89
|
+
advanced=False,
|
|
90
|
+
value=256,
|
|
91
|
+
info="The maximum number of tokens to generate for each chat completion.",
|
|
92
|
+
),
|
|
93
|
+
IntInput(
|
|
94
|
+
name="max_retries",
|
|
95
|
+
display_name="Max retries",
|
|
96
|
+
advanced=True,
|
|
97
|
+
required=False,
|
|
98
|
+
value=6,
|
|
99
|
+
),
|
|
100
|
+
BoolInput(
|
|
101
|
+
name="verbose",
|
|
102
|
+
display_name="Verbose",
|
|
103
|
+
advanced=True,
|
|
104
|
+
required=False,
|
|
105
|
+
value=False,
|
|
106
|
+
),
|
|
107
|
+
BoolInput(
|
|
108
|
+
name="stream",
|
|
109
|
+
display_name="Stream",
|
|
110
|
+
info=STREAM_INFO_TEXT,
|
|
111
|
+
advanced=True,
|
|
112
|
+
),
|
|
113
|
+
StrInput(
|
|
114
|
+
name="system_message",
|
|
115
|
+
display_name="System Message",
|
|
116
|
+
info="System message to pass to the model.",
|
|
117
|
+
advanced=True,
|
|
118
|
+
),
|
|
119
|
+
]
|
|
120
|
+
|
|
121
|
+
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
|
122
|
+
try:
|
|
123
|
+
import litellm
|
|
124
|
+
|
|
125
|
+
litellm.drop_params = True
|
|
126
|
+
litellm.set_verbose = self.verbose
|
|
127
|
+
except ImportError as e:
|
|
128
|
+
msg = "Could not import litellm python package. Please install it with `pip install litellm`"
|
|
129
|
+
raise ChatLiteLLMException(msg) from e
|
|
130
|
+
# Remove empty keys
|
|
131
|
+
if "" in self.kwargs:
|
|
132
|
+
del self.kwargs[""]
|
|
133
|
+
if "" in self.model_kwargs:
|
|
134
|
+
del self.model_kwargs[""]
|
|
135
|
+
# Report missing fields for Azure provider
|
|
136
|
+
if self.provider == "Azure":
|
|
137
|
+
if "api_base" not in self.kwargs:
|
|
138
|
+
msg = "Missing api_base on kwargs"
|
|
139
|
+
raise ValueError(msg)
|
|
140
|
+
if "api_version" not in self.model_kwargs:
|
|
141
|
+
msg = "Missing api_version on model_kwargs"
|
|
142
|
+
raise ValueError(msg)
|
|
143
|
+
output = ChatLiteLLM(
|
|
144
|
+
model=f"{self.provider.lower()}/{self.model}",
|
|
145
|
+
client=None,
|
|
146
|
+
streaming=self.stream,
|
|
147
|
+
temperature=self.temperature,
|
|
148
|
+
model_kwargs=self.model_kwargs if self.model_kwargs is not None else {},
|
|
149
|
+
top_p=self.top_p,
|
|
150
|
+
top_k=self.top_k,
|
|
151
|
+
n=self.n,
|
|
152
|
+
max_tokens=self.max_tokens,
|
|
153
|
+
max_retries=self.max_retries,
|
|
154
|
+
**self.kwargs,
|
|
155
|
+
)
|
|
156
|
+
output.client.api_key = self.api_key
|
|
157
|
+
|
|
158
|
+
return output
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
from lfx.custom.custom_component.component import Component
|
|
4
|
+
from lfx.field_typing import Input, Output, Text
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class CodeBlockExtractor(Component):
|
|
8
|
+
display_name = "Code Block Extractor"
|
|
9
|
+
description = "Extracts code block from text."
|
|
10
|
+
name = "CodeBlockExtractor"
|
|
11
|
+
|
|
12
|
+
inputs = [Input(name="text", field_type=Text, description="Text to extract code blocks from.")]
|
|
13
|
+
|
|
14
|
+
outputs = [Output(name="code_block", display_name="Code Block", method="get_code_block")]
|
|
15
|
+
|
|
16
|
+
def get_code_block(self) -> Text:
|
|
17
|
+
text = self.text.strip()
|
|
18
|
+
# Extract code block
|
|
19
|
+
# It may start with ``` or ```language
|
|
20
|
+
# It may end with ```
|
|
21
|
+
pattern = r"^```(?:\w+)?\s*\n(.*?)(?=^```)```"
|
|
22
|
+
match = re.search(pattern, text, re.MULTILINE)
|
|
23
|
+
code_block = ""
|
|
24
|
+
if match:
|
|
25
|
+
code_block = match.group(1)
|
|
26
|
+
return code_block
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from langchain_core.documents import Document
|
|
2
|
+
|
|
3
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
|
4
|
+
from lfx.schema.data import Data
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class DocumentsToDataComponent(CustomComponent):
|
|
8
|
+
display_name = "Documents ⇢ Data"
|
|
9
|
+
description = "Convert LangChain Documents into Data."
|
|
10
|
+
icon = "LangChain"
|
|
11
|
+
name = "DocumentsToData"
|
|
12
|
+
|
|
13
|
+
field_config = {
|
|
14
|
+
"documents": {"display_name": "Documents"},
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
def build(self, documents: list[Document]) -> list[Data]:
|
|
18
|
+
if isinstance(documents, Document):
|
|
19
|
+
documents = [documents]
|
|
20
|
+
data = [Data.from_document(document) for document in documents]
|
|
21
|
+
self.status = data
|
|
22
|
+
return data
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
|
2
|
+
from lfx.field_typing import Embeddings
|
|
3
|
+
from lfx.schema.data import Data
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class EmbedComponent(CustomComponent):
|
|
7
|
+
display_name = "Embed Texts"
|
|
8
|
+
name = "Embed"
|
|
9
|
+
|
|
10
|
+
def build_config(self):
|
|
11
|
+
return {"texts": {"display_name": "Texts"}, "embbedings": {"display_name": "Embeddings"}}
|
|
12
|
+
|
|
13
|
+
def build(self, texts: list[str], embbedings: Embeddings) -> Data:
|
|
14
|
+
vectors = Data(vector=embbedings.embed_documents(texts))
|
|
15
|
+
self.status = vectors
|
|
16
|
+
return vectors
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
|
2
|
+
from lfx.schema.data import Data
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ExtractKeyFromDataComponent(CustomComponent):
|
|
6
|
+
display_name = "Extract Key From Data"
|
|
7
|
+
description = "Extracts a key from a data."
|
|
8
|
+
beta: bool = True
|
|
9
|
+
name = "ExtractKeyFromData"
|
|
10
|
+
|
|
11
|
+
field_config = {
|
|
12
|
+
"data": {"display_name": "Data"},
|
|
13
|
+
"keys": {
|
|
14
|
+
"display_name": "Keys",
|
|
15
|
+
"info": "The keys to extract from the data.",
|
|
16
|
+
"input_types": [],
|
|
17
|
+
},
|
|
18
|
+
"silent_error": {
|
|
19
|
+
"display_name": "Silent Errors",
|
|
20
|
+
"info": "If True, errors will not be raised.",
|
|
21
|
+
"advanced": True,
|
|
22
|
+
},
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
def build(self, data: Data, keys: list[str], *, silent_error: bool = True) -> Data:
|
|
26
|
+
"""Extracts the keys from a data.
|
|
27
|
+
|
|
28
|
+
Args:
|
|
29
|
+
data (Data): The data from which to extract the keys.
|
|
30
|
+
keys (list[str]): The keys to extract from the data.
|
|
31
|
+
silent_error (bool): If True, errors will not be raised.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
dict: The extracted keys.
|
|
35
|
+
"""
|
|
36
|
+
extracted_keys = {}
|
|
37
|
+
for key in keys:
|
|
38
|
+
try:
|
|
39
|
+
extracted_keys[key] = getattr(data, key)
|
|
40
|
+
except AttributeError as e:
|
|
41
|
+
if not silent_error:
|
|
42
|
+
msg = f"The key '{key}' does not exist in the data."
|
|
43
|
+
raise KeyError(msg) from e
|
|
44
|
+
return_data = Data(data=extracted_keys)
|
|
45
|
+
self.status = return_data
|
|
46
|
+
return return_data
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# JSON Document Builder
|
|
2
|
+
|
|
3
|
+
# Build a Document containing a JSON object using a key and another Document page content.
|
|
4
|
+
|
|
5
|
+
# **Params**
|
|
6
|
+
|
|
7
|
+
# - **Key:** The key to use for the JSON object.
|
|
8
|
+
# - **Document:** The Document page to use for the JSON object.
|
|
9
|
+
|
|
10
|
+
# **Output**
|
|
11
|
+
|
|
12
|
+
# - **Document:** The Document containing the JSON object.
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
import orjson
|
|
16
|
+
from langchain_core.documents import Document
|
|
17
|
+
|
|
18
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
|
19
|
+
from lfx.io import HandleInput, StrInput
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class JSONDocumentBuilder(CustomComponent):
|
|
23
|
+
display_name: str = "JSON Document Builder"
|
|
24
|
+
description: str = "Build a Document containing a JSON object using a key and another Document page content."
|
|
25
|
+
name = "JSONDocumentBuilder"
|
|
26
|
+
documentation: str = "https://docs.langflow.org/legacy-core-components"
|
|
27
|
+
legacy = True
|
|
28
|
+
|
|
29
|
+
inputs = [
|
|
30
|
+
StrInput(
|
|
31
|
+
name="key",
|
|
32
|
+
display_name="Key",
|
|
33
|
+
required=True,
|
|
34
|
+
),
|
|
35
|
+
HandleInput(
|
|
36
|
+
name="document",
|
|
37
|
+
display_name="Document",
|
|
38
|
+
required=True,
|
|
39
|
+
),
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
def build(
|
|
43
|
+
self,
|
|
44
|
+
key: str,
|
|
45
|
+
document: Document,
|
|
46
|
+
) -> Document:
|
|
47
|
+
documents = None
|
|
48
|
+
if isinstance(document, list):
|
|
49
|
+
documents = [Document(page_content=orjson.dumps({key: doc.page_content}).decode()) for doc in document]
|
|
50
|
+
elif isinstance(document, Document):
|
|
51
|
+
documents = Document(page_content=orjson.dumps({key: document.page_content}).decode())
|
|
52
|
+
else:
|
|
53
|
+
msg = f"Expected Document or list of Documents, got {type(document)}"
|
|
54
|
+
raise TypeError(msg)
|
|
55
|
+
|
|
56
|
+
self.repr_value = documents
|
|
57
|
+
return documents
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
|
2
|
+
from lfx.schema.data import Data
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class ListFlowsComponent(CustomComponent):
|
|
6
|
+
display_name = "List Flows"
|
|
7
|
+
description = "A component to list all available flows."
|
|
8
|
+
icon = "ListFlows"
|
|
9
|
+
beta: bool = True
|
|
10
|
+
name = "ListFlows"
|
|
11
|
+
|
|
12
|
+
def build_config(self):
|
|
13
|
+
return {}
|
|
14
|
+
|
|
15
|
+
async def build(
|
|
16
|
+
self,
|
|
17
|
+
) -> list[Data]:
|
|
18
|
+
flows = await self.alist_flows()
|
|
19
|
+
self.status = flows
|
|
20
|
+
return flows
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# from lfx.field_typing import Data
|
|
2
|
+
|
|
3
|
+
from langchain_core.tools import StructuredTool
|
|
4
|
+
from mcp import types
|
|
5
|
+
|
|
6
|
+
from lfx.base.mcp.util import (
|
|
7
|
+
MCPSseClient,
|
|
8
|
+
create_input_schema_from_json_schema,
|
|
9
|
+
create_tool_coroutine,
|
|
10
|
+
create_tool_func,
|
|
11
|
+
)
|
|
12
|
+
from lfx.custom.custom_component.component import Component
|
|
13
|
+
from lfx.field_typing import Tool
|
|
14
|
+
from lfx.io import MessageTextInput, Output
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class MCPSse(Component):
|
|
18
|
+
client = MCPSseClient()
|
|
19
|
+
tools = types.ListToolsResult
|
|
20
|
+
tool_names = [str]
|
|
21
|
+
display_name = "MCP Tools (SSE) [DEPRECATED]"
|
|
22
|
+
description = "Connects to an MCP server over SSE and exposes it's tools as langflow tools to be used by an Agent."
|
|
23
|
+
documentation: str = "https://docs.langflow.org/components-custom-components"
|
|
24
|
+
icon = "code"
|
|
25
|
+
name = "MCPSse"
|
|
26
|
+
legacy = True
|
|
27
|
+
|
|
28
|
+
inputs = [
|
|
29
|
+
MessageTextInput(
|
|
30
|
+
name="url",
|
|
31
|
+
display_name="mcp sse url",
|
|
32
|
+
info="sse url",
|
|
33
|
+
value="http://localhost:7860/api/v1/mcp/sse",
|
|
34
|
+
tool_mode=True,
|
|
35
|
+
),
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
outputs = [
|
|
39
|
+
Output(display_name="Tools", name="tools", method="build_output"),
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
async def build_output(self) -> list[Tool]:
|
|
43
|
+
if self.client.session is None:
|
|
44
|
+
self.tools = await self.client.connect_to_server(self.url, {})
|
|
45
|
+
|
|
46
|
+
tool_list = []
|
|
47
|
+
|
|
48
|
+
for tool in self.tools:
|
|
49
|
+
args_schema = create_input_schema_from_json_schema(tool.inputSchema)
|
|
50
|
+
tool_list.append(
|
|
51
|
+
StructuredTool(
|
|
52
|
+
name=tool.name, # maybe format this
|
|
53
|
+
description=tool.description,
|
|
54
|
+
args_schema=args_schema,
|
|
55
|
+
func=create_tool_func(tool.name, args_schema, self.client.session),
|
|
56
|
+
coroutine=create_tool_coroutine(tool.name, args_schema, self.client.session),
|
|
57
|
+
)
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
self.tool_names = [tool.name for tool in self.tools]
|
|
61
|
+
return tool_list
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# from lfx.field_typing import Data
|
|
2
|
+
|
|
3
|
+
from langchain_core.tools import StructuredTool
|
|
4
|
+
from mcp import types
|
|
5
|
+
|
|
6
|
+
from lfx.base.mcp.util import (
|
|
7
|
+
MCPStdioClient,
|
|
8
|
+
create_input_schema_from_json_schema,
|
|
9
|
+
create_tool_coroutine,
|
|
10
|
+
create_tool_func,
|
|
11
|
+
)
|
|
12
|
+
from lfx.custom.custom_component.component import Component
|
|
13
|
+
from lfx.field_typing import Tool
|
|
14
|
+
from lfx.io import MessageTextInput, Output
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class MCPStdio(Component):
|
|
18
|
+
client = MCPStdioClient()
|
|
19
|
+
tools = types.ListToolsResult
|
|
20
|
+
tool_names = [str]
|
|
21
|
+
display_name = "MCP Tools (stdio) [DEPRECATED]"
|
|
22
|
+
description = (
|
|
23
|
+
"Connects to an MCP server over stdio and exposes it's tools as langflow tools to be used by an Agent."
|
|
24
|
+
)
|
|
25
|
+
documentation: str = "https://docs.langflow.org/components-custom-components"
|
|
26
|
+
icon = "code"
|
|
27
|
+
name = "MCPStdio"
|
|
28
|
+
legacy = True
|
|
29
|
+
|
|
30
|
+
inputs = [
|
|
31
|
+
MessageTextInput(
|
|
32
|
+
name="command",
|
|
33
|
+
display_name="mcp command",
|
|
34
|
+
info="mcp command",
|
|
35
|
+
value="uvx mcp-sse-shim@latest",
|
|
36
|
+
tool_mode=True,
|
|
37
|
+
),
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
outputs = [
|
|
41
|
+
Output(display_name="Tools", name="tools", method="build_output"),
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
async def build_output(self) -> list[Tool]:
|
|
45
|
+
if self.client.session is None:
|
|
46
|
+
self.tools = await self.client.connect_to_server(self.command)
|
|
47
|
+
|
|
48
|
+
tool_list = []
|
|
49
|
+
|
|
50
|
+
for tool in self.tools:
|
|
51
|
+
args_schema = create_input_schema_from_json_schema(tool.inputSchema)
|
|
52
|
+
tool_list.append(
|
|
53
|
+
StructuredTool(
|
|
54
|
+
name=tool.name,
|
|
55
|
+
description=tool.description,
|
|
56
|
+
args_schema=args_schema,
|
|
57
|
+
func=create_tool_func(tool.name, args_schema, self.client.session),
|
|
58
|
+
coroutine=create_tool_coroutine(tool.name, args_schema, self.client.session),
|
|
59
|
+
)
|
|
60
|
+
)
|
|
61
|
+
self.tool_names = [tool.name for tool in self.tools]
|
|
62
|
+
return tool_list
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
from lfx.custom.custom_component.component import Component
|
|
2
|
+
from lfx.io import DataInput, Output
|
|
3
|
+
from lfx.log.logger import logger
|
|
4
|
+
from lfx.schema.data import Data
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class MergeDataComponent(Component):
|
|
8
|
+
"""MergeDataComponent is responsible for combining multiple Data objects into a unified list of Data objects.
|
|
9
|
+
|
|
10
|
+
It ensures that all keys across the input Data objects are present in each merged Data object.
|
|
11
|
+
Missing keys are filled with empty strings to maintain consistency.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
display_name = "Merge Data"
|
|
15
|
+
description = (
|
|
16
|
+
"Combines multiple Data objects into a unified list, ensuring all keys are present in each Data object."
|
|
17
|
+
)
|
|
18
|
+
icon = "merge"
|
|
19
|
+
|
|
20
|
+
inputs = [
|
|
21
|
+
DataInput(
|
|
22
|
+
name="data_inputs",
|
|
23
|
+
display_name="Data Inputs",
|
|
24
|
+
is_list=True,
|
|
25
|
+
info="A list of Data inputs objects to be merged.",
|
|
26
|
+
),
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
outputs = [
|
|
30
|
+
Output(
|
|
31
|
+
display_name="Merged Data",
|
|
32
|
+
name="merged_data",
|
|
33
|
+
method="merge_data",
|
|
34
|
+
),
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
def merge_data(self) -> list[Data]:
|
|
38
|
+
"""Merges multiple Data objects into a single list of Data objects.
|
|
39
|
+
|
|
40
|
+
Ensures that all keys from the input Data objects are present in each merged Data object.
|
|
41
|
+
Missing keys are filled with empty strings.
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
List[Data]: A list of merged Data objects with consistent keys.
|
|
45
|
+
"""
|
|
46
|
+
logger.info("Initiating the data merging process.")
|
|
47
|
+
|
|
48
|
+
data_inputs: list[Data] = self.data_inputs
|
|
49
|
+
logger.debug(f"Received {len(data_inputs)} data input(s) for merging.")
|
|
50
|
+
|
|
51
|
+
if not data_inputs:
|
|
52
|
+
logger.warning("No data inputs provided. Returning an empty list.")
|
|
53
|
+
return []
|
|
54
|
+
|
|
55
|
+
# Collect all unique keys from all Data objects
|
|
56
|
+
all_keys: set[str] = set()
|
|
57
|
+
for idx, data_input in enumerate(data_inputs):
|
|
58
|
+
if not isinstance(data_input, Data):
|
|
59
|
+
error_message = f"Data input at index {idx} is not of type Data."
|
|
60
|
+
logger.error(error_message)
|
|
61
|
+
type_error_message = (
|
|
62
|
+
f"All items in data_inputs must be of type Data. Item at index {idx} is {type(data_input)}"
|
|
63
|
+
)
|
|
64
|
+
raise TypeError(type_error_message)
|
|
65
|
+
all_keys.update(data_input.data.keys())
|
|
66
|
+
logger.debug(f"Collected {len(all_keys)} unique key(s) from input data.")
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
# Create new list of Data objects with missing keys filled with empty strings
|
|
70
|
+
merged_data_list = []
|
|
71
|
+
for idx, data_input in enumerate(data_inputs):
|
|
72
|
+
merged_data_dict = {}
|
|
73
|
+
|
|
74
|
+
for key in all_keys:
|
|
75
|
+
# Use the existing value if the key exists, otherwise use an empty string
|
|
76
|
+
value = data_input.data.get(key, "")
|
|
77
|
+
if key not in data_input.data:
|
|
78
|
+
log_message = f"Key '{key}' missing in data input at index {idx}. Assigning empty string."
|
|
79
|
+
logger.debug(log_message)
|
|
80
|
+
merged_data_dict[key] = value
|
|
81
|
+
|
|
82
|
+
merged_data = Data(
|
|
83
|
+
text_key=data_input.text_key, data=merged_data_dict, default_value=data_input.default_value
|
|
84
|
+
)
|
|
85
|
+
merged_data_list.append(merged_data)
|
|
86
|
+
logger.debug(f"Merged Data object created for input at index {idx}.")
|
|
87
|
+
|
|
88
|
+
except Exception:
|
|
89
|
+
logger.exception("An error occurred during the data merging process.")
|
|
90
|
+
raise
|
|
91
|
+
|
|
92
|
+
logger.info("Data merging process completed successfully.")
|
|
93
|
+
return merged_data_list
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from lfx.custom.custom_component.custom_component import CustomComponent
|
|
2
|
+
from lfx.schema.message import Message
|
|
3
|
+
from lfx.utils.constants import MESSAGE_SENDER_AI, MESSAGE_SENDER_USER
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class MessageComponent(CustomComponent):
|
|
7
|
+
display_name = "Message"
|
|
8
|
+
description = "Creates a Message object given a Session ID."
|
|
9
|
+
name = "Message"
|
|
10
|
+
|
|
11
|
+
def build_config(self):
|
|
12
|
+
return {
|
|
13
|
+
"sender": {
|
|
14
|
+
"options": [MESSAGE_SENDER_AI, MESSAGE_SENDER_USER],
|
|
15
|
+
"display_name": "Sender Type",
|
|
16
|
+
},
|
|
17
|
+
"sender_name": {"display_name": "Sender Name"},
|
|
18
|
+
"text": {"display_name": "Text"},
|
|
19
|
+
"session_id": {
|
|
20
|
+
"display_name": "Session ID",
|
|
21
|
+
"info": "Session ID of the chat history.",
|
|
22
|
+
"input_types": ["Message"],
|
|
23
|
+
},
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
def build(
|
|
27
|
+
self,
|
|
28
|
+
sender: str = MESSAGE_SENDER_USER,
|
|
29
|
+
sender_name: str | None = None,
|
|
30
|
+
session_id: str | None = None,
|
|
31
|
+
text: str = "",
|
|
32
|
+
) -> Message:
|
|
33
|
+
flow_id = self.graph.flow_id if hasattr(self, "graph") else None
|
|
34
|
+
message = Message(text=text, sender=sender, sender_name=sender_name, flow_id=flow_id, session_id=session_id)
|
|
35
|
+
|
|
36
|
+
self.status = message
|
|
37
|
+
return message
|