lfx-nightly 0.1.11.dev0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lfx/__init__.py +0 -0
- lfx/__main__.py +25 -0
- lfx/base/__init__.py +0 -0
- lfx/base/agents/__init__.py +0 -0
- lfx/base/agents/agent.py +268 -0
- lfx/base/agents/callback.py +130 -0
- lfx/base/agents/context.py +109 -0
- lfx/base/agents/crewai/__init__.py +0 -0
- lfx/base/agents/crewai/crew.py +231 -0
- lfx/base/agents/crewai/tasks.py +12 -0
- lfx/base/agents/default_prompts.py +23 -0
- lfx/base/agents/errors.py +15 -0
- lfx/base/agents/events.py +346 -0
- lfx/base/agents/utils.py +205 -0
- lfx/base/astra_assistants/__init__.py +0 -0
- lfx/base/astra_assistants/util.py +171 -0
- lfx/base/chains/__init__.py +0 -0
- lfx/base/chains/model.py +19 -0
- lfx/base/composio/__init__.py +0 -0
- lfx/base/composio/composio_base.py +1291 -0
- lfx/base/compressors/__init__.py +0 -0
- lfx/base/compressors/model.py +60 -0
- lfx/base/constants.py +46 -0
- lfx/base/curl/__init__.py +0 -0
- lfx/base/curl/parse.py +188 -0
- lfx/base/data/__init__.py +5 -0
- lfx/base/data/base_file.py +685 -0
- lfx/base/data/docling_utils.py +245 -0
- lfx/base/data/utils.py +198 -0
- lfx/base/document_transformers/__init__.py +0 -0
- lfx/base/document_transformers/model.py +43 -0
- lfx/base/embeddings/__init__.py +0 -0
- lfx/base/embeddings/aiml_embeddings.py +62 -0
- lfx/base/embeddings/model.py +26 -0
- lfx/base/flow_processing/__init__.py +0 -0
- lfx/base/flow_processing/utils.py +86 -0
- lfx/base/huggingface/__init__.py +0 -0
- lfx/base/huggingface/model_bridge.py +133 -0
- lfx/base/io/__init__.py +0 -0
- lfx/base/io/chat.py +20 -0
- lfx/base/io/text.py +22 -0
- lfx/base/langchain_utilities/__init__.py +0 -0
- lfx/base/langchain_utilities/model.py +35 -0
- lfx/base/langchain_utilities/spider_constants.py +1 -0
- lfx/base/langwatch/__init__.py +0 -0
- lfx/base/langwatch/utils.py +18 -0
- lfx/base/mcp/__init__.py +0 -0
- lfx/base/mcp/constants.py +2 -0
- lfx/base/mcp/util.py +1398 -0
- lfx/base/memory/__init__.py +0 -0
- lfx/base/memory/memory.py +49 -0
- lfx/base/memory/model.py +38 -0
- lfx/base/models/__init__.py +3 -0
- lfx/base/models/aiml_constants.py +51 -0
- lfx/base/models/anthropic_constants.py +47 -0
- lfx/base/models/aws_constants.py +151 -0
- lfx/base/models/chat_result.py +76 -0
- lfx/base/models/google_generative_ai_constants.py +70 -0
- lfx/base/models/groq_constants.py +134 -0
- lfx/base/models/model.py +375 -0
- lfx/base/models/model_input_constants.py +307 -0
- lfx/base/models/model_metadata.py +41 -0
- lfx/base/models/model_utils.py +8 -0
- lfx/base/models/novita_constants.py +35 -0
- lfx/base/models/ollama_constants.py +49 -0
- lfx/base/models/openai_constants.py +122 -0
- lfx/base/models/sambanova_constants.py +18 -0
- lfx/base/processing/__init__.py +0 -0
- lfx/base/prompts/__init__.py +0 -0
- lfx/base/prompts/api_utils.py +224 -0
- lfx/base/prompts/utils.py +61 -0
- lfx/base/textsplitters/__init__.py +0 -0
- lfx/base/textsplitters/model.py +28 -0
- lfx/base/tools/__init__.py +0 -0
- lfx/base/tools/base.py +26 -0
- lfx/base/tools/component_tool.py +325 -0
- lfx/base/tools/constants.py +49 -0
- lfx/base/tools/flow_tool.py +132 -0
- lfx/base/tools/run_flow.py +224 -0
- lfx/base/vectorstores/__init__.py +0 -0
- lfx/base/vectorstores/model.py +193 -0
- lfx/base/vectorstores/utils.py +22 -0
- lfx/base/vectorstores/vector_store_connection_decorator.py +52 -0
- lfx/cli/__init__.py +5 -0
- lfx/cli/commands.py +319 -0
- lfx/cli/common.py +650 -0
- lfx/cli/run.py +441 -0
- lfx/cli/script_loader.py +247 -0
- lfx/cli/serve_app.py +546 -0
- lfx/cli/validation.py +69 -0
- lfx/components/FAISS/__init__.py +34 -0
- lfx/components/FAISS/faiss.py +111 -0
- lfx/components/Notion/__init__.py +19 -0
- lfx/components/Notion/add_content_to_page.py +269 -0
- lfx/components/Notion/create_page.py +94 -0
- lfx/components/Notion/list_database_properties.py +68 -0
- lfx/components/Notion/list_pages.py +122 -0
- lfx/components/Notion/list_users.py +77 -0
- lfx/components/Notion/page_content_viewer.py +93 -0
- lfx/components/Notion/search.py +111 -0
- lfx/components/Notion/update_page_property.py +114 -0
- lfx/components/__init__.py +411 -0
- lfx/components/_importing.py +42 -0
- lfx/components/agentql/__init__.py +3 -0
- lfx/components/agentql/agentql_api.py +151 -0
- lfx/components/agents/__init__.py +34 -0
- lfx/components/agents/agent.py +558 -0
- lfx/components/agents/mcp_component.py +501 -0
- lfx/components/aiml/__init__.py +37 -0
- lfx/components/aiml/aiml.py +112 -0
- lfx/components/aiml/aiml_embeddings.py +37 -0
- lfx/components/amazon/__init__.py +36 -0
- lfx/components/amazon/amazon_bedrock_embedding.py +109 -0
- lfx/components/amazon/amazon_bedrock_model.py +124 -0
- lfx/components/amazon/s3_bucket_uploader.py +211 -0
- lfx/components/anthropic/__init__.py +34 -0
- lfx/components/anthropic/anthropic.py +187 -0
- lfx/components/apify/__init__.py +5 -0
- lfx/components/apify/apify_actor.py +325 -0
- lfx/components/arxiv/__init__.py +3 -0
- lfx/components/arxiv/arxiv.py +163 -0
- lfx/components/assemblyai/__init__.py +46 -0
- lfx/components/assemblyai/assemblyai_get_subtitles.py +83 -0
- lfx/components/assemblyai/assemblyai_lemur.py +183 -0
- lfx/components/assemblyai/assemblyai_list_transcripts.py +95 -0
- lfx/components/assemblyai/assemblyai_poll_transcript.py +72 -0
- lfx/components/assemblyai/assemblyai_start_transcript.py +188 -0
- lfx/components/azure/__init__.py +37 -0
- lfx/components/azure/azure_openai.py +95 -0
- lfx/components/azure/azure_openai_embeddings.py +83 -0
- lfx/components/baidu/__init__.py +32 -0
- lfx/components/baidu/baidu_qianfan_chat.py +113 -0
- lfx/components/bing/__init__.py +3 -0
- lfx/components/bing/bing_search_api.py +61 -0
- lfx/components/cassandra/__init__.py +40 -0
- lfx/components/cassandra/cassandra.py +264 -0
- lfx/components/cassandra/cassandra_chat.py +92 -0
- lfx/components/cassandra/cassandra_graph.py +238 -0
- lfx/components/chains/__init__.py +3 -0
- lfx/components/chroma/__init__.py +34 -0
- lfx/components/chroma/chroma.py +167 -0
- lfx/components/cleanlab/__init__.py +40 -0
- lfx/components/cleanlab/cleanlab_evaluator.py +155 -0
- lfx/components/cleanlab/cleanlab_rag_evaluator.py +254 -0
- lfx/components/cleanlab/cleanlab_remediator.py +131 -0
- lfx/components/clickhouse/__init__.py +34 -0
- lfx/components/clickhouse/clickhouse.py +135 -0
- lfx/components/cloudflare/__init__.py +32 -0
- lfx/components/cloudflare/cloudflare.py +81 -0
- lfx/components/cohere/__init__.py +40 -0
- lfx/components/cohere/cohere_embeddings.py +81 -0
- lfx/components/cohere/cohere_models.py +46 -0
- lfx/components/cohere/cohere_rerank.py +51 -0
- lfx/components/composio/__init__.py +74 -0
- lfx/components/composio/composio_api.py +268 -0
- lfx/components/composio/dropbox_compnent.py +11 -0
- lfx/components/composio/github_composio.py +11 -0
- lfx/components/composio/gmail_composio.py +38 -0
- lfx/components/composio/googlecalendar_composio.py +11 -0
- lfx/components/composio/googlemeet_composio.py +11 -0
- lfx/components/composio/googletasks_composio.py +8 -0
- lfx/components/composio/linear_composio.py +11 -0
- lfx/components/composio/outlook_composio.py +11 -0
- lfx/components/composio/reddit_composio.py +11 -0
- lfx/components/composio/slack_composio.py +582 -0
- lfx/components/composio/slackbot_composio.py +11 -0
- lfx/components/composio/supabase_composio.py +11 -0
- lfx/components/composio/todoist_composio.py +11 -0
- lfx/components/composio/youtube_composio.py +11 -0
- lfx/components/confluence/__init__.py +3 -0
- lfx/components/confluence/confluence.py +84 -0
- lfx/components/couchbase/__init__.py +34 -0
- lfx/components/couchbase/couchbase.py +102 -0
- lfx/components/crewai/__init__.py +49 -0
- lfx/components/crewai/crewai.py +107 -0
- lfx/components/crewai/hierarchical_crew.py +46 -0
- lfx/components/crewai/hierarchical_task.py +44 -0
- lfx/components/crewai/sequential_crew.py +52 -0
- lfx/components/crewai/sequential_task.py +73 -0
- lfx/components/crewai/sequential_task_agent.py +143 -0
- lfx/components/custom_component/__init__.py +34 -0
- lfx/components/custom_component/custom_component.py +31 -0
- lfx/components/data/__init__.py +64 -0
- lfx/components/data/api_request.py +544 -0
- lfx/components/data/csv_to_data.py +95 -0
- lfx/components/data/directory.py +113 -0
- lfx/components/data/file.py +577 -0
- lfx/components/data/json_to_data.py +98 -0
- lfx/components/data/news_search.py +164 -0
- lfx/components/data/rss.py +69 -0
- lfx/components/data/sql_executor.py +101 -0
- lfx/components/data/url.py +311 -0
- lfx/components/data/web_search.py +112 -0
- lfx/components/data/webhook.py +56 -0
- lfx/components/datastax/__init__.py +70 -0
- lfx/components/datastax/astra_assistant_manager.py +306 -0
- lfx/components/datastax/astra_db.py +75 -0
- lfx/components/datastax/astra_vectorize.py +124 -0
- lfx/components/datastax/astradb.py +1285 -0
- lfx/components/datastax/astradb_cql.py +314 -0
- lfx/components/datastax/astradb_graph.py +330 -0
- lfx/components/datastax/astradb_tool.py +414 -0
- lfx/components/datastax/astradb_vectorstore.py +1285 -0
- lfx/components/datastax/cassandra.py +92 -0
- lfx/components/datastax/create_assistant.py +58 -0
- lfx/components/datastax/create_thread.py +32 -0
- lfx/components/datastax/dotenv.py +35 -0
- lfx/components/datastax/get_assistant.py +37 -0
- lfx/components/datastax/getenvvar.py +30 -0
- lfx/components/datastax/graph_rag.py +141 -0
- lfx/components/datastax/hcd.py +314 -0
- lfx/components/datastax/list_assistants.py +25 -0
- lfx/components/datastax/run.py +89 -0
- lfx/components/deactivated/__init__.py +15 -0
- lfx/components/deactivated/amazon_kendra.py +66 -0
- lfx/components/deactivated/chat_litellm_model.py +158 -0
- lfx/components/deactivated/code_block_extractor.py +26 -0
- lfx/components/deactivated/documents_to_data.py +22 -0
- lfx/components/deactivated/embed.py +16 -0
- lfx/components/deactivated/extract_key_from_data.py +46 -0
- lfx/components/deactivated/json_document_builder.py +57 -0
- lfx/components/deactivated/list_flows.py +20 -0
- lfx/components/deactivated/mcp_sse.py +61 -0
- lfx/components/deactivated/mcp_stdio.py +62 -0
- lfx/components/deactivated/merge_data.py +93 -0
- lfx/components/deactivated/message.py +37 -0
- lfx/components/deactivated/metal.py +54 -0
- lfx/components/deactivated/multi_query.py +59 -0
- lfx/components/deactivated/retriever.py +43 -0
- lfx/components/deactivated/selective_passthrough.py +77 -0
- lfx/components/deactivated/should_run_next.py +40 -0
- lfx/components/deactivated/split_text.py +63 -0
- lfx/components/deactivated/store_message.py +24 -0
- lfx/components/deactivated/sub_flow.py +124 -0
- lfx/components/deactivated/vectara_self_query.py +76 -0
- lfx/components/deactivated/vector_store.py +24 -0
- lfx/components/deepseek/__init__.py +34 -0
- lfx/components/deepseek/deepseek.py +136 -0
- lfx/components/docling/__init__.py +43 -0
- lfx/components/docling/chunk_docling_document.py +186 -0
- lfx/components/docling/docling_inline.py +231 -0
- lfx/components/docling/docling_remote.py +193 -0
- lfx/components/docling/export_docling_document.py +117 -0
- lfx/components/documentloaders/__init__.py +3 -0
- lfx/components/duckduckgo/__init__.py +3 -0
- lfx/components/duckduckgo/duck_duck_go_search_run.py +92 -0
- lfx/components/elastic/__init__.py +37 -0
- lfx/components/elastic/elasticsearch.py +267 -0
- lfx/components/elastic/opensearch.py +243 -0
- lfx/components/embeddings/__init__.py +37 -0
- lfx/components/embeddings/similarity.py +76 -0
- lfx/components/embeddings/text_embedder.py +64 -0
- lfx/components/exa/__init__.py +3 -0
- lfx/components/exa/exa_search.py +68 -0
- lfx/components/firecrawl/__init__.py +43 -0
- lfx/components/firecrawl/firecrawl_crawl_api.py +88 -0
- lfx/components/firecrawl/firecrawl_extract_api.py +136 -0
- lfx/components/firecrawl/firecrawl_map_api.py +89 -0
- lfx/components/firecrawl/firecrawl_scrape_api.py +73 -0
- lfx/components/git/__init__.py +4 -0
- lfx/components/git/git.py +262 -0
- lfx/components/git/gitextractor.py +196 -0
- lfx/components/glean/__init__.py +3 -0
- lfx/components/glean/glean_search_api.py +173 -0
- lfx/components/google/__init__.py +17 -0
- lfx/components/google/gmail.py +192 -0
- lfx/components/google/google_bq_sql_executor.py +157 -0
- lfx/components/google/google_drive.py +92 -0
- lfx/components/google/google_drive_search.py +152 -0
- lfx/components/google/google_generative_ai.py +147 -0
- lfx/components/google/google_generative_ai_embeddings.py +141 -0
- lfx/components/google/google_oauth_token.py +89 -0
- lfx/components/google/google_search_api_core.py +68 -0
- lfx/components/google/google_serper_api_core.py +74 -0
- lfx/components/groq/__init__.py +34 -0
- lfx/components/groq/groq.py +136 -0
- lfx/components/helpers/__init__.py +52 -0
- lfx/components/helpers/calculator_core.py +89 -0
- lfx/components/helpers/create_list.py +40 -0
- lfx/components/helpers/current_date.py +42 -0
- lfx/components/helpers/id_generator.py +42 -0
- lfx/components/helpers/memory.py +251 -0
- lfx/components/helpers/output_parser.py +45 -0
- lfx/components/helpers/store_message.py +90 -0
- lfx/components/homeassistant/__init__.py +7 -0
- lfx/components/homeassistant/home_assistant_control.py +152 -0
- lfx/components/homeassistant/list_home_assistant_states.py +137 -0
- lfx/components/huggingface/__init__.py +37 -0
- lfx/components/huggingface/huggingface.py +197 -0
- lfx/components/huggingface/huggingface_inference_api.py +106 -0
- lfx/components/ibm/__init__.py +34 -0
- lfx/components/ibm/watsonx.py +203 -0
- lfx/components/ibm/watsonx_embeddings.py +135 -0
- lfx/components/icosacomputing/__init__.py +5 -0
- lfx/components/icosacomputing/combinatorial_reasoner.py +84 -0
- lfx/components/input_output/__init__.py +38 -0
- lfx/components/input_output/chat.py +120 -0
- lfx/components/input_output/chat_output.py +200 -0
- lfx/components/input_output/text.py +27 -0
- lfx/components/input_output/text_output.py +29 -0
- lfx/components/jigsawstack/__init__.py +23 -0
- lfx/components/jigsawstack/ai_scrape.py +126 -0
- lfx/components/jigsawstack/ai_web_search.py +136 -0
- lfx/components/jigsawstack/file_read.py +115 -0
- lfx/components/jigsawstack/file_upload.py +94 -0
- lfx/components/jigsawstack/image_generation.py +205 -0
- lfx/components/jigsawstack/nsfw.py +60 -0
- lfx/components/jigsawstack/object_detection.py +124 -0
- lfx/components/jigsawstack/sentiment.py +112 -0
- lfx/components/jigsawstack/text_to_sql.py +90 -0
- lfx/components/jigsawstack/text_translate.py +77 -0
- lfx/components/jigsawstack/vocr.py +107 -0
- lfx/components/langchain_utilities/__init__.py +109 -0
- lfx/components/langchain_utilities/character.py +53 -0
- lfx/components/langchain_utilities/conversation.py +59 -0
- lfx/components/langchain_utilities/csv_agent.py +107 -0
- lfx/components/langchain_utilities/fake_embeddings.py +26 -0
- lfx/components/langchain_utilities/html_link_extractor.py +35 -0
- lfx/components/langchain_utilities/json_agent.py +45 -0
- lfx/components/langchain_utilities/langchain_hub.py +126 -0
- lfx/components/langchain_utilities/language_recursive.py +49 -0
- lfx/components/langchain_utilities/language_semantic.py +138 -0
- lfx/components/langchain_utilities/llm_checker.py +39 -0
- lfx/components/langchain_utilities/llm_math.py +42 -0
- lfx/components/langchain_utilities/natural_language.py +61 -0
- lfx/components/langchain_utilities/openai_tools.py +53 -0
- lfx/components/langchain_utilities/openapi.py +48 -0
- lfx/components/langchain_utilities/recursive_character.py +60 -0
- lfx/components/langchain_utilities/retrieval_qa.py +83 -0
- lfx/components/langchain_utilities/runnable_executor.py +137 -0
- lfx/components/langchain_utilities/self_query.py +80 -0
- lfx/components/langchain_utilities/spider.py +142 -0
- lfx/components/langchain_utilities/sql.py +40 -0
- lfx/components/langchain_utilities/sql_database.py +35 -0
- lfx/components/langchain_utilities/sql_generator.py +78 -0
- lfx/components/langchain_utilities/tool_calling.py +59 -0
- lfx/components/langchain_utilities/vector_store_info.py +49 -0
- lfx/components/langchain_utilities/vector_store_router.py +33 -0
- lfx/components/langchain_utilities/xml_agent.py +71 -0
- lfx/components/langwatch/__init__.py +3 -0
- lfx/components/langwatch/langwatch.py +278 -0
- lfx/components/link_extractors/__init__.py +3 -0
- lfx/components/lmstudio/__init__.py +34 -0
- lfx/components/lmstudio/lmstudioembeddings.py +89 -0
- lfx/components/lmstudio/lmstudiomodel.py +129 -0
- lfx/components/logic/__init__.py +52 -0
- lfx/components/logic/conditional_router.py +171 -0
- lfx/components/logic/data_conditional_router.py +125 -0
- lfx/components/logic/flow_tool.py +110 -0
- lfx/components/logic/listen.py +29 -0
- lfx/components/logic/loop.py +125 -0
- lfx/components/logic/notify.py +88 -0
- lfx/components/logic/pass_message.py +35 -0
- lfx/components/logic/run_flow.py +71 -0
- lfx/components/logic/sub_flow.py +114 -0
- lfx/components/maritalk/__init__.py +32 -0
- lfx/components/maritalk/maritalk.py +52 -0
- lfx/components/mem0/__init__.py +3 -0
- lfx/components/mem0/mem0_chat_memory.py +136 -0
- lfx/components/milvus/__init__.py +34 -0
- lfx/components/milvus/milvus.py +115 -0
- lfx/components/mistral/__init__.py +37 -0
- lfx/components/mistral/mistral.py +114 -0
- lfx/components/mistral/mistral_embeddings.py +58 -0
- lfx/components/models/__init__.py +34 -0
- lfx/components/models/embedding_model.py +114 -0
- lfx/components/models/language_model.py +144 -0
- lfx/components/mongodb/__init__.py +34 -0
- lfx/components/mongodb/mongodb_atlas.py +213 -0
- lfx/components/needle/__init__.py +3 -0
- lfx/components/needle/needle.py +104 -0
- lfx/components/notdiamond/__init__.py +34 -0
- lfx/components/notdiamond/notdiamond.py +228 -0
- lfx/components/novita/__init__.py +32 -0
- lfx/components/novita/novita.py +130 -0
- lfx/components/nvidia/__init__.py +57 -0
- lfx/components/nvidia/nvidia.py +157 -0
- lfx/components/nvidia/nvidia_embedding.py +77 -0
- lfx/components/nvidia/nvidia_ingest.py +317 -0
- lfx/components/nvidia/nvidia_rerank.py +63 -0
- lfx/components/nvidia/system_assist.py +65 -0
- lfx/components/olivya/__init__.py +3 -0
- lfx/components/olivya/olivya.py +116 -0
- lfx/components/ollama/__init__.py +37 -0
- lfx/components/ollama/ollama.py +330 -0
- lfx/components/ollama/ollama_embeddings.py +106 -0
- lfx/components/openai/__init__.py +37 -0
- lfx/components/openai/openai.py +100 -0
- lfx/components/openai/openai_chat_model.py +176 -0
- lfx/components/openrouter/__init__.py +32 -0
- lfx/components/openrouter/openrouter.py +202 -0
- lfx/components/output_parsers/__init__.py +3 -0
- lfx/components/perplexity/__init__.py +34 -0
- lfx/components/perplexity/perplexity.py +75 -0
- lfx/components/pgvector/__init__.py +34 -0
- lfx/components/pgvector/pgvector.py +72 -0
- lfx/components/pinecone/__init__.py +34 -0
- lfx/components/pinecone/pinecone.py +134 -0
- lfx/components/processing/__init__.py +117 -0
- lfx/components/processing/alter_metadata.py +108 -0
- lfx/components/processing/batch_run.py +205 -0
- lfx/components/processing/combine_text.py +39 -0
- lfx/components/processing/converter.py +159 -0
- lfx/components/processing/create_data.py +110 -0
- lfx/components/processing/data_operations.py +438 -0
- lfx/components/processing/data_to_dataframe.py +70 -0
- lfx/components/processing/dataframe_operations.py +313 -0
- lfx/components/processing/extract_key.py +53 -0
- lfx/components/processing/filter_data.py +42 -0
- lfx/components/processing/filter_data_values.py +88 -0
- lfx/components/processing/json_cleaner.py +103 -0
- lfx/components/processing/lambda_filter.py +154 -0
- lfx/components/processing/llm_router.py +499 -0
- lfx/components/processing/merge_data.py +90 -0
- lfx/components/processing/message_to_data.py +36 -0
- lfx/components/processing/parse_data.py +70 -0
- lfx/components/processing/parse_dataframe.py +68 -0
- lfx/components/processing/parse_json_data.py +90 -0
- lfx/components/processing/parser.py +143 -0
- lfx/components/processing/prompt.py +67 -0
- lfx/components/processing/python_repl_core.py +98 -0
- lfx/components/processing/regex.py +82 -0
- lfx/components/processing/save_file.py +225 -0
- lfx/components/processing/select_data.py +48 -0
- lfx/components/processing/split_text.py +141 -0
- lfx/components/processing/structured_output.py +202 -0
- lfx/components/processing/update_data.py +160 -0
- lfx/components/prototypes/__init__.py +34 -0
- lfx/components/prototypes/python_function.py +73 -0
- lfx/components/qdrant/__init__.py +34 -0
- lfx/components/qdrant/qdrant.py +109 -0
- lfx/components/redis/__init__.py +37 -0
- lfx/components/redis/redis.py +89 -0
- lfx/components/redis/redis_chat.py +43 -0
- lfx/components/sambanova/__init__.py +32 -0
- lfx/components/sambanova/sambanova.py +84 -0
- lfx/components/scrapegraph/__init__.py +40 -0
- lfx/components/scrapegraph/scrapegraph_markdownify_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_search_api.py +64 -0
- lfx/components/scrapegraph/scrapegraph_smart_scraper_api.py +71 -0
- lfx/components/searchapi/__init__.py +34 -0
- lfx/components/searchapi/search.py +79 -0
- lfx/components/serpapi/__init__.py +3 -0
- lfx/components/serpapi/serp.py +115 -0
- lfx/components/supabase/__init__.py +34 -0
- lfx/components/supabase/supabase.py +76 -0
- lfx/components/tavily/__init__.py +4 -0
- lfx/components/tavily/tavily_extract.py +117 -0
- lfx/components/tavily/tavily_search.py +212 -0
- lfx/components/textsplitters/__init__.py +3 -0
- lfx/components/toolkits/__init__.py +3 -0
- lfx/components/tools/__init__.py +72 -0
- lfx/components/tools/calculator.py +108 -0
- lfx/components/tools/google_search_api.py +45 -0
- lfx/components/tools/google_serper_api.py +115 -0
- lfx/components/tools/python_code_structured_tool.py +327 -0
- lfx/components/tools/python_repl.py +97 -0
- lfx/components/tools/search_api.py +87 -0
- lfx/components/tools/searxng.py +145 -0
- lfx/components/tools/serp_api.py +119 -0
- lfx/components/tools/tavily_search_tool.py +344 -0
- lfx/components/tools/wikidata_api.py +102 -0
- lfx/components/tools/wikipedia_api.py +49 -0
- lfx/components/tools/yahoo_finance.py +129 -0
- lfx/components/twelvelabs/__init__.py +52 -0
- lfx/components/twelvelabs/convert_astra_results.py +84 -0
- lfx/components/twelvelabs/pegasus_index.py +311 -0
- lfx/components/twelvelabs/split_video.py +291 -0
- lfx/components/twelvelabs/text_embeddings.py +57 -0
- lfx/components/twelvelabs/twelvelabs_pegasus.py +408 -0
- lfx/components/twelvelabs/video_embeddings.py +100 -0
- lfx/components/twelvelabs/video_file.py +179 -0
- lfx/components/unstructured/__init__.py +3 -0
- lfx/components/unstructured/unstructured.py +121 -0
- lfx/components/upstash/__init__.py +34 -0
- lfx/components/upstash/upstash.py +124 -0
- lfx/components/vectara/__init__.py +37 -0
- lfx/components/vectara/vectara.py +97 -0
- lfx/components/vectara/vectara_rag.py +164 -0
- lfx/components/vectorstores/__init__.py +40 -0
- lfx/components/vectorstores/astradb.py +1285 -0
- lfx/components/vectorstores/astradb_graph.py +319 -0
- lfx/components/vectorstores/cassandra.py +264 -0
- lfx/components/vectorstores/cassandra_graph.py +238 -0
- lfx/components/vectorstores/chroma.py +167 -0
- lfx/components/vectorstores/clickhouse.py +135 -0
- lfx/components/vectorstores/couchbase.py +102 -0
- lfx/components/vectorstores/elasticsearch.py +267 -0
- lfx/components/vectorstores/faiss.py +111 -0
- lfx/components/vectorstores/graph_rag.py +141 -0
- lfx/components/vectorstores/hcd.py +314 -0
- lfx/components/vectorstores/local_db.py +261 -0
- lfx/components/vectorstores/milvus.py +115 -0
- lfx/components/vectorstores/mongodb_atlas.py +213 -0
- lfx/components/vectorstores/opensearch.py +243 -0
- lfx/components/vectorstores/pgvector.py +72 -0
- lfx/components/vectorstores/pinecone.py +134 -0
- lfx/components/vectorstores/qdrant.py +109 -0
- lfx/components/vectorstores/supabase.py +76 -0
- lfx/components/vectorstores/upstash.py +124 -0
- lfx/components/vectorstores/vectara.py +97 -0
- lfx/components/vectorstores/vectara_rag.py +164 -0
- lfx/components/vectorstores/weaviate.py +89 -0
- lfx/components/vertexai/__init__.py +37 -0
- lfx/components/vertexai/vertexai.py +71 -0
- lfx/components/vertexai/vertexai_embeddings.py +67 -0
- lfx/components/weaviate/__init__.py +34 -0
- lfx/components/weaviate/weaviate.py +89 -0
- lfx/components/wikipedia/__init__.py +4 -0
- lfx/components/wikipedia/wikidata.py +86 -0
- lfx/components/wikipedia/wikipedia.py +53 -0
- lfx/components/wolframalpha/__init__.py +3 -0
- lfx/components/wolframalpha/wolfram_alpha_api.py +54 -0
- lfx/components/xai/__init__.py +32 -0
- lfx/components/xai/xai.py +167 -0
- lfx/components/yahoosearch/__init__.py +3 -0
- lfx/components/yahoosearch/yahoo.py +137 -0
- lfx/components/youtube/__init__.py +52 -0
- lfx/components/youtube/channel.py +227 -0
- lfx/components/youtube/comments.py +231 -0
- lfx/components/youtube/playlist.py +33 -0
- lfx/components/youtube/search.py +120 -0
- lfx/components/youtube/trending.py +285 -0
- lfx/components/youtube/video_details.py +263 -0
- lfx/components/youtube/youtube_transcripts.py +118 -0
- lfx/components/zep/__init__.py +3 -0
- lfx/components/zep/zep.py +44 -0
- lfx/constants.py +6 -0
- lfx/custom/__init__.py +7 -0
- lfx/custom/attributes.py +86 -0
- lfx/custom/code_parser/__init__.py +3 -0
- lfx/custom/code_parser/code_parser.py +361 -0
- lfx/custom/custom_component/__init__.py +0 -0
- lfx/custom/custom_component/base_component.py +128 -0
- lfx/custom/custom_component/component.py +1808 -0
- lfx/custom/custom_component/component_with_cache.py +8 -0
- lfx/custom/custom_component/custom_component.py +588 -0
- lfx/custom/dependency_analyzer.py +165 -0
- lfx/custom/directory_reader/__init__.py +3 -0
- lfx/custom/directory_reader/directory_reader.py +359 -0
- lfx/custom/directory_reader/utils.py +171 -0
- lfx/custom/eval.py +12 -0
- lfx/custom/schema.py +32 -0
- lfx/custom/tree_visitor.py +21 -0
- lfx/custom/utils.py +877 -0
- lfx/custom/validate.py +488 -0
- lfx/events/__init__.py +1 -0
- lfx/events/event_manager.py +110 -0
- lfx/exceptions/__init__.py +0 -0
- lfx/exceptions/component.py +15 -0
- lfx/field_typing/__init__.py +91 -0
- lfx/field_typing/constants.py +215 -0
- lfx/field_typing/range_spec.py +35 -0
- lfx/graph/__init__.py +6 -0
- lfx/graph/edge/__init__.py +0 -0
- lfx/graph/edge/base.py +277 -0
- lfx/graph/edge/schema.py +119 -0
- lfx/graph/edge/utils.py +0 -0
- lfx/graph/graph/__init__.py +0 -0
- lfx/graph/graph/ascii.py +202 -0
- lfx/graph/graph/base.py +2238 -0
- lfx/graph/graph/constants.py +63 -0
- lfx/graph/graph/runnable_vertices_manager.py +133 -0
- lfx/graph/graph/schema.py +52 -0
- lfx/graph/graph/state_model.py +66 -0
- lfx/graph/graph/utils.py +1024 -0
- lfx/graph/schema.py +75 -0
- lfx/graph/state/__init__.py +0 -0
- lfx/graph/state/model.py +237 -0
- lfx/graph/utils.py +200 -0
- lfx/graph/vertex/__init__.py +0 -0
- lfx/graph/vertex/base.py +823 -0
- lfx/graph/vertex/constants.py +0 -0
- lfx/graph/vertex/exceptions.py +4 -0
- lfx/graph/vertex/param_handler.py +264 -0
- lfx/graph/vertex/schema.py +26 -0
- lfx/graph/vertex/utils.py +19 -0
- lfx/graph/vertex/vertex_types.py +489 -0
- lfx/helpers/__init__.py +1 -0
- lfx/helpers/base_model.py +71 -0
- lfx/helpers/custom.py +13 -0
- lfx/helpers/data.py +167 -0
- lfx/helpers/flow.py +194 -0
- lfx/inputs/__init__.py +68 -0
- lfx/inputs/constants.py +2 -0
- lfx/inputs/input_mixin.py +328 -0
- lfx/inputs/inputs.py +714 -0
- lfx/inputs/validators.py +19 -0
- lfx/interface/__init__.py +6 -0
- lfx/interface/components.py +489 -0
- lfx/interface/importing/__init__.py +5 -0
- lfx/interface/importing/utils.py +39 -0
- lfx/interface/initialize/__init__.py +3 -0
- lfx/interface/initialize/loading.py +224 -0
- lfx/interface/listing.py +26 -0
- lfx/interface/run.py +16 -0
- lfx/interface/utils.py +111 -0
- lfx/io/__init__.py +63 -0
- lfx/io/schema.py +289 -0
- lfx/load/__init__.py +8 -0
- lfx/load/load.py +256 -0
- lfx/load/utils.py +99 -0
- lfx/log/__init__.py +5 -0
- lfx/log/logger.py +385 -0
- lfx/memory/__init__.py +90 -0
- lfx/memory/stubs.py +283 -0
- lfx/processing/__init__.py +1 -0
- lfx/processing/process.py +238 -0
- lfx/processing/utils.py +25 -0
- lfx/py.typed +0 -0
- lfx/schema/__init__.py +66 -0
- lfx/schema/artifact.py +83 -0
- lfx/schema/content_block.py +62 -0
- lfx/schema/content_types.py +91 -0
- lfx/schema/data.py +308 -0
- lfx/schema/dataframe.py +210 -0
- lfx/schema/dotdict.py +74 -0
- lfx/schema/encoders.py +13 -0
- lfx/schema/graph.py +47 -0
- lfx/schema/image.py +131 -0
- lfx/schema/json_schema.py +141 -0
- lfx/schema/log.py +61 -0
- lfx/schema/message.py +473 -0
- lfx/schema/openai_responses_schemas.py +74 -0
- lfx/schema/properties.py +41 -0
- lfx/schema/schema.py +171 -0
- lfx/schema/serialize.py +13 -0
- lfx/schema/table.py +140 -0
- lfx/schema/validators.py +114 -0
- lfx/serialization/__init__.py +5 -0
- lfx/serialization/constants.py +2 -0
- lfx/serialization/serialization.py +314 -0
- lfx/services/__init__.py +23 -0
- lfx/services/base.py +28 -0
- lfx/services/cache/__init__.py +6 -0
- lfx/services/cache/base.py +183 -0
- lfx/services/cache/service.py +166 -0
- lfx/services/cache/utils.py +169 -0
- lfx/services/chat/__init__.py +1 -0
- lfx/services/chat/config.py +2 -0
- lfx/services/chat/schema.py +10 -0
- lfx/services/deps.py +129 -0
- lfx/services/factory.py +19 -0
- lfx/services/initialize.py +19 -0
- lfx/services/interfaces.py +103 -0
- lfx/services/manager.py +172 -0
- lfx/services/schema.py +20 -0
- lfx/services/session.py +82 -0
- lfx/services/settings/__init__.py +3 -0
- lfx/services/settings/auth.py +130 -0
- lfx/services/settings/base.py +539 -0
- lfx/services/settings/constants.py +31 -0
- lfx/services/settings/factory.py +23 -0
- lfx/services/settings/feature_flags.py +12 -0
- lfx/services/settings/service.py +35 -0
- lfx/services/settings/utils.py +40 -0
- lfx/services/shared_component_cache/__init__.py +1 -0
- lfx/services/shared_component_cache/factory.py +30 -0
- lfx/services/shared_component_cache/service.py +9 -0
- lfx/services/storage/__init__.py +5 -0
- lfx/services/storage/local.py +155 -0
- lfx/services/storage/service.py +54 -0
- lfx/services/tracing/__init__.py +1 -0
- lfx/services/tracing/service.py +21 -0
- lfx/settings.py +6 -0
- lfx/template/__init__.py +6 -0
- lfx/template/field/__init__.py +0 -0
- lfx/template/field/base.py +257 -0
- lfx/template/field/prompt.py +15 -0
- lfx/template/frontend_node/__init__.py +6 -0
- lfx/template/frontend_node/base.py +212 -0
- lfx/template/frontend_node/constants.py +65 -0
- lfx/template/frontend_node/custom_components.py +79 -0
- lfx/template/template/__init__.py +0 -0
- lfx/template/template/base.py +100 -0
- lfx/template/utils.py +217 -0
- lfx/type_extraction/__init__.py +19 -0
- lfx/type_extraction/type_extraction.py +75 -0
- lfx/type_extraction.py +80 -0
- lfx/utils/__init__.py +1 -0
- lfx/utils/async_helpers.py +42 -0
- lfx/utils/component_utils.py +154 -0
- lfx/utils/concurrency.py +60 -0
- lfx/utils/connection_string_parser.py +11 -0
- lfx/utils/constants.py +205 -0
- lfx/utils/data_structure.py +212 -0
- lfx/utils/exceptions.py +22 -0
- lfx/utils/helpers.py +28 -0
- lfx/utils/image.py +73 -0
- lfx/utils/lazy_load.py +15 -0
- lfx/utils/request_utils.py +18 -0
- lfx/utils/schemas.py +139 -0
- lfx/utils/util.py +481 -0
- lfx/utils/util_strings.py +56 -0
- lfx/utils/version.py +24 -0
- lfx_nightly-0.1.11.dev0.dist-info/METADATA +293 -0
- lfx_nightly-0.1.11.dev0.dist-info/RECORD +699 -0
- lfx_nightly-0.1.11.dev0.dist-info/WHEEL +4 -0
- lfx_nightly-0.1.11.dev0.dist-info/entry_points.txt +2 -0
lfx/base/models/model.py
ADDED
@@ -0,0 +1,375 @@
|
|
1
|
+
import importlib
|
2
|
+
import json
|
3
|
+
import warnings
|
4
|
+
from abc import abstractmethod
|
5
|
+
|
6
|
+
from langchain_core.language_models import BaseChatModel
|
7
|
+
from langchain_core.language_models.llms import LLM
|
8
|
+
from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, SystemMessage
|
9
|
+
from langchain_core.output_parsers import BaseOutputParser
|
10
|
+
|
11
|
+
from lfx.base.constants import STREAM_INFO_TEXT
|
12
|
+
from lfx.custom.custom_component.component import Component
|
13
|
+
from lfx.field_typing import LanguageModel
|
14
|
+
from lfx.inputs.inputs import BoolInput, InputTypes, MessageInput, MultilineInput
|
15
|
+
from lfx.schema.message import Message
|
16
|
+
from lfx.template.field.base import Output
|
17
|
+
from lfx.utils.constants import MESSAGE_SENDER_AI
|
18
|
+
|
19
|
+
# Enabled detailed thinking for NVIDIA reasoning models.
|
20
|
+
#
|
21
|
+
# Models are trained with this exact string. Do not update.
|
22
|
+
DETAILED_THINKING_PREFIX = "detailed thinking on\n\n"
|
23
|
+
|
24
|
+
|
25
|
+
class LCModelComponent(Component):
|
26
|
+
display_name: str = "Model Name"
|
27
|
+
description: str = "Model Description"
|
28
|
+
trace_type = "llm"
|
29
|
+
metadata = {
|
30
|
+
"keywords": [
|
31
|
+
"model",
|
32
|
+
"llm",
|
33
|
+
"language model",
|
34
|
+
"large language model",
|
35
|
+
],
|
36
|
+
}
|
37
|
+
|
38
|
+
# Optional output parser to pass to the runnable. Subclasses may allow the user to input an `output_parser`
|
39
|
+
output_parser: BaseOutputParser | None = None
|
40
|
+
|
41
|
+
_base_inputs: list[InputTypes] = [
|
42
|
+
MessageInput(name="input_value", display_name="Input"),
|
43
|
+
MultilineInput(
|
44
|
+
name="system_message",
|
45
|
+
display_name="System Message",
|
46
|
+
info="System message to pass to the model.",
|
47
|
+
advanced=False,
|
48
|
+
),
|
49
|
+
BoolInput(name="stream", display_name="Stream", info=STREAM_INFO_TEXT, advanced=True),
|
50
|
+
]
|
51
|
+
|
52
|
+
outputs = [
|
53
|
+
Output(display_name="Model Response", name="text_output", method="text_response"),
|
54
|
+
Output(display_name="Language Model", name="model_output", method="build_model"),
|
55
|
+
]
|
56
|
+
|
57
|
+
def _get_exception_message(self, e: Exception):
|
58
|
+
return str(e)
|
59
|
+
|
60
|
+
def supports_tool_calling(self, model: LanguageModel) -> bool:
|
61
|
+
try:
|
62
|
+
# Check if the bind_tools method is the same as the base class's method
|
63
|
+
if model.bind_tools is BaseChatModel.bind_tools:
|
64
|
+
return False
|
65
|
+
|
66
|
+
def test_tool(x: int) -> int:
|
67
|
+
return x
|
68
|
+
|
69
|
+
model_with_tool = model.bind_tools([test_tool])
|
70
|
+
return hasattr(model_with_tool, "tools") and len(model_with_tool.tools) > 0
|
71
|
+
except (AttributeError, TypeError, ValueError):
|
72
|
+
return False
|
73
|
+
|
74
|
+
def _validate_outputs(self) -> None:
|
75
|
+
# At least these two outputs must be defined
|
76
|
+
required_output_methods = ["text_response", "build_model"]
|
77
|
+
output_names = [output.name for output in self.outputs]
|
78
|
+
for method_name in required_output_methods:
|
79
|
+
if method_name not in output_names:
|
80
|
+
msg = f"Output with name '{method_name}' must be defined."
|
81
|
+
raise ValueError(msg)
|
82
|
+
if not hasattr(self, method_name):
|
83
|
+
msg = f"Method '{method_name}' must be defined."
|
84
|
+
raise ValueError(msg)
|
85
|
+
|
86
|
+
async def text_response(self) -> Message:
|
87
|
+
output = self.build_model()
|
88
|
+
result = await self.get_chat_result(
|
89
|
+
runnable=output, stream=self.stream, input_value=self.input_value, system_message=self.system_message
|
90
|
+
)
|
91
|
+
self.status = result
|
92
|
+
return result
|
93
|
+
|
94
|
+
def get_result(self, *, runnable: LLM, stream: bool, input_value: str):
|
95
|
+
"""Retrieves the result from the output of a Runnable object.
|
96
|
+
|
97
|
+
Args:
|
98
|
+
runnable (Runnable): The runnable to retrieve the result from.
|
99
|
+
stream (bool): Indicates whether to use streaming or invocation mode.
|
100
|
+
input_value (str): The input value to pass to the output object.
|
101
|
+
|
102
|
+
Returns:
|
103
|
+
The result obtained from the output object.
|
104
|
+
"""
|
105
|
+
try:
|
106
|
+
if stream:
|
107
|
+
result = runnable.stream(input_value)
|
108
|
+
else:
|
109
|
+
message = runnable.invoke(input_value)
|
110
|
+
result = message.content if hasattr(message, "content") else message
|
111
|
+
self.status = result
|
112
|
+
except Exception as e:
|
113
|
+
if message := self._get_exception_message(e):
|
114
|
+
raise ValueError(message) from e
|
115
|
+
raise
|
116
|
+
|
117
|
+
return result
|
118
|
+
|
119
|
+
def build_status_message(self, message: AIMessage):
|
120
|
+
"""Builds a status message from an AIMessage object.
|
121
|
+
|
122
|
+
Args:
|
123
|
+
message (AIMessage): The AIMessage object to build the status message from.
|
124
|
+
|
125
|
+
Returns:
|
126
|
+
The status message.
|
127
|
+
"""
|
128
|
+
if message.response_metadata:
|
129
|
+
# Build a well formatted status message
|
130
|
+
content = message.content
|
131
|
+
response_metadata = message.response_metadata
|
132
|
+
openai_keys = ["token_usage", "model_name", "finish_reason"]
|
133
|
+
inner_openai_keys = ["completion_tokens", "prompt_tokens", "total_tokens"]
|
134
|
+
anthropic_keys = ["model", "usage", "stop_reason"]
|
135
|
+
inner_anthropic_keys = ["input_tokens", "output_tokens"]
|
136
|
+
if all(key in response_metadata for key in openai_keys) and all(
|
137
|
+
key in response_metadata["token_usage"] for key in inner_openai_keys
|
138
|
+
):
|
139
|
+
token_usage = response_metadata["token_usage"]
|
140
|
+
status_message = {
|
141
|
+
"tokens": {
|
142
|
+
"input": token_usage["prompt_tokens"],
|
143
|
+
"output": token_usage["completion_tokens"],
|
144
|
+
"total": token_usage["total_tokens"],
|
145
|
+
"stop_reason": response_metadata["finish_reason"],
|
146
|
+
"response": content,
|
147
|
+
}
|
148
|
+
}
|
149
|
+
|
150
|
+
elif all(key in response_metadata for key in anthropic_keys) and all(
|
151
|
+
key in response_metadata["usage"] for key in inner_anthropic_keys
|
152
|
+
):
|
153
|
+
usage = response_metadata["usage"]
|
154
|
+
status_message = {
|
155
|
+
"tokens": {
|
156
|
+
"input": usage["input_tokens"],
|
157
|
+
"output": usage["output_tokens"],
|
158
|
+
"stop_reason": response_metadata["stop_reason"],
|
159
|
+
"response": content,
|
160
|
+
}
|
161
|
+
}
|
162
|
+
else:
|
163
|
+
status_message = f"Response: {content}" # type: ignore[assignment]
|
164
|
+
else:
|
165
|
+
status_message = f"Response: {message.content}" # type: ignore[assignment]
|
166
|
+
return status_message
|
167
|
+
|
168
|
+
async def get_chat_result(
|
169
|
+
self,
|
170
|
+
*,
|
171
|
+
runnable: LanguageModel,
|
172
|
+
stream: bool,
|
173
|
+
input_value: str | Message,
|
174
|
+
system_message: str | None = None,
|
175
|
+
) -> Message:
|
176
|
+
# NVIDIA reasoning models use detailed thinking
|
177
|
+
if getattr(self, "detailed_thinking", False):
|
178
|
+
system_message = DETAILED_THINKING_PREFIX + (system_message or "")
|
179
|
+
|
180
|
+
return await self._get_chat_result(
|
181
|
+
runnable=runnable,
|
182
|
+
stream=stream,
|
183
|
+
input_value=input_value,
|
184
|
+
system_message=system_message,
|
185
|
+
)
|
186
|
+
|
187
|
+
async def _get_chat_result(
|
188
|
+
self,
|
189
|
+
*,
|
190
|
+
runnable: LanguageModel,
|
191
|
+
stream: bool,
|
192
|
+
input_value: str | Message,
|
193
|
+
system_message: str | None = None,
|
194
|
+
) -> Message:
|
195
|
+
"""Get chat result from a language model.
|
196
|
+
|
197
|
+
This method handles the core logic of getting a response from a language model,
|
198
|
+
including handling different input types, streaming, and error handling.
|
199
|
+
|
200
|
+
Args:
|
201
|
+
runnable (LanguageModel): The language model to use for generating responses
|
202
|
+
stream (bool): Whether to stream the response
|
203
|
+
input_value (str | Message): The input to send to the model
|
204
|
+
system_message (str | None, optional): System message to prepend. Defaults to None.
|
205
|
+
|
206
|
+
Returns:
|
207
|
+
The model response, either as a Message object or raw content
|
208
|
+
|
209
|
+
Raises:
|
210
|
+
ValueError: If the input message is empty or if there's an error during model invocation
|
211
|
+
"""
|
212
|
+
messages: list[BaseMessage] = []
|
213
|
+
if not input_value and not system_message:
|
214
|
+
msg = "The message you want to send to the model is empty."
|
215
|
+
raise ValueError(msg)
|
216
|
+
system_message_added = False
|
217
|
+
message = None
|
218
|
+
if input_value:
|
219
|
+
if isinstance(input_value, Message):
|
220
|
+
with warnings.catch_warnings():
|
221
|
+
warnings.simplefilter("ignore")
|
222
|
+
if "prompt" in input_value:
|
223
|
+
prompt = input_value.load_lc_prompt()
|
224
|
+
if system_message:
|
225
|
+
prompt.messages = [
|
226
|
+
SystemMessage(content=system_message),
|
227
|
+
*prompt.messages, # type: ignore[has-type]
|
228
|
+
]
|
229
|
+
system_message_added = True
|
230
|
+
runnable = prompt | runnable
|
231
|
+
else:
|
232
|
+
messages.append(input_value.to_lc_message())
|
233
|
+
else:
|
234
|
+
messages.append(HumanMessage(content=input_value))
|
235
|
+
|
236
|
+
if system_message and not system_message_added:
|
237
|
+
messages.insert(0, SystemMessage(content=system_message))
|
238
|
+
inputs: list | dict = messages or {}
|
239
|
+
lf_message = None
|
240
|
+
try:
|
241
|
+
# TODO: Depreciated Feature to be removed in upcoming release
|
242
|
+
if hasattr(self, "output_parser") and self.output_parser is not None:
|
243
|
+
runnable |= self.output_parser
|
244
|
+
|
245
|
+
runnable = runnable.with_config(
|
246
|
+
{
|
247
|
+
"run_name": self.display_name,
|
248
|
+
"project_name": self.get_project_name(),
|
249
|
+
"callbacks": self.get_langchain_callbacks(),
|
250
|
+
}
|
251
|
+
)
|
252
|
+
if stream:
|
253
|
+
lf_message, result = await self._handle_stream(runnable, inputs)
|
254
|
+
else:
|
255
|
+
message = await runnable.ainvoke(inputs)
|
256
|
+
result = message.content if hasattr(message, "content") else message
|
257
|
+
if isinstance(message, AIMessage):
|
258
|
+
status_message = self.build_status_message(message)
|
259
|
+
self.status = status_message
|
260
|
+
elif isinstance(result, dict):
|
261
|
+
result = json.dumps(message, indent=4)
|
262
|
+
self.status = result
|
263
|
+
else:
|
264
|
+
self.status = result
|
265
|
+
except Exception as e:
|
266
|
+
if message := self._get_exception_message(e):
|
267
|
+
raise ValueError(message) from e
|
268
|
+
raise
|
269
|
+
return lf_message or Message(text=result)
|
270
|
+
|
271
|
+
async def _handle_stream(self, runnable, inputs):
|
272
|
+
"""Handle streaming responses from the language model.
|
273
|
+
|
274
|
+
Args:
|
275
|
+
runnable: The language model configured for streaming
|
276
|
+
inputs: The inputs to send to the model
|
277
|
+
|
278
|
+
Returns:
|
279
|
+
tuple: (Message object if connected to chat output, model result)
|
280
|
+
"""
|
281
|
+
lf_message = None
|
282
|
+
if self.is_connected_to_chat_output():
|
283
|
+
# Add a Message
|
284
|
+
if hasattr(self, "graph"):
|
285
|
+
session_id = self.graph.session_id
|
286
|
+
elif hasattr(self, "_session_id"):
|
287
|
+
session_id = self._session_id
|
288
|
+
else:
|
289
|
+
session_id = None
|
290
|
+
model_message = Message(
|
291
|
+
text=runnable.astream(inputs),
|
292
|
+
sender=MESSAGE_SENDER_AI,
|
293
|
+
sender_name="AI",
|
294
|
+
properties={"icon": self.icon, "state": "partial"},
|
295
|
+
session_id=session_id,
|
296
|
+
)
|
297
|
+
model_message.properties.source = self._build_source(self._id, self.display_name, self)
|
298
|
+
lf_message = await self.send_message(model_message)
|
299
|
+
result = lf_message.text
|
300
|
+
else:
|
301
|
+
message = await runnable.ainvoke(inputs)
|
302
|
+
result = message.content if hasattr(message, "content") else message
|
303
|
+
return lf_message, result
|
304
|
+
|
305
|
+
@abstractmethod
|
306
|
+
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
307
|
+
"""Implement this method to build the model."""
|
308
|
+
|
309
|
+
def get_llm(self, provider_name: str, model_info: dict[str, dict[str, str | list[InputTypes]]]) -> LanguageModel:
|
310
|
+
"""Get LLM model based on provider name and inputs.
|
311
|
+
|
312
|
+
Args:
|
313
|
+
provider_name: Name of the model provider (e.g., "OpenAI", "Azure OpenAI")
|
314
|
+
inputs: Dictionary of input parameters for the model
|
315
|
+
model_info: Dictionary of model information
|
316
|
+
|
317
|
+
Returns:
|
318
|
+
Built LLM model instance
|
319
|
+
"""
|
320
|
+
try:
|
321
|
+
if provider_name not in [model.get("display_name") for model in model_info.values()]:
|
322
|
+
msg = f"Unknown model provider: {provider_name}"
|
323
|
+
raise ValueError(msg)
|
324
|
+
|
325
|
+
# Find the component class name from MODEL_INFO in a single iteration
|
326
|
+
component_info, module_name = next(
|
327
|
+
((info, key) for key, info in model_info.items() if info.get("display_name") == provider_name),
|
328
|
+
(None, None),
|
329
|
+
)
|
330
|
+
if not component_info:
|
331
|
+
msg = f"Component information not found for {provider_name}"
|
332
|
+
raise ValueError(msg)
|
333
|
+
component_inputs = component_info.get("inputs", [])
|
334
|
+
# Get the component class from the models module
|
335
|
+
# Ensure component_inputs is a list of the expected types
|
336
|
+
if not isinstance(component_inputs, list):
|
337
|
+
component_inputs = []
|
338
|
+
|
339
|
+
import warnings
|
340
|
+
|
341
|
+
with warnings.catch_warnings():
|
342
|
+
warnings.filterwarnings(
|
343
|
+
"ignore", message="Support for class-based `config` is deprecated", category=DeprecationWarning
|
344
|
+
)
|
345
|
+
warnings.filterwarnings("ignore", message="Valid config keys have changed in V2", category=UserWarning)
|
346
|
+
models_module = importlib.import_module("lfx.components.models")
|
347
|
+
component_class = getattr(models_module, str(module_name))
|
348
|
+
component = component_class()
|
349
|
+
|
350
|
+
return self.build_llm_model_from_inputs(component, component_inputs)
|
351
|
+
except Exception as e:
|
352
|
+
msg = f"Error building {provider_name} language model"
|
353
|
+
raise ValueError(msg) from e
|
354
|
+
|
355
|
+
def build_llm_model_from_inputs(
|
356
|
+
self, component: Component, inputs: list[InputTypes], prefix: str = ""
|
357
|
+
) -> LanguageModel:
|
358
|
+
"""Build LLM model from component and inputs.
|
359
|
+
|
360
|
+
Args:
|
361
|
+
component: LLM component instance
|
362
|
+
inputs: Dictionary of input parameters for the model
|
363
|
+
prefix: Prefix for the input names
|
364
|
+
Returns:
|
365
|
+
Built LLM model instance
|
366
|
+
"""
|
367
|
+
# Ensure prefix is a string
|
368
|
+
prefix = prefix or ""
|
369
|
+
# Filter inputs to only include valid component input names
|
370
|
+
input_data = {
|
371
|
+
str(component_input.name): getattr(self, f"{prefix}{component_input.name}", None)
|
372
|
+
for component_input in inputs
|
373
|
+
}
|
374
|
+
|
375
|
+
return component.set(**input_data).build_model()
|
@@ -0,0 +1,307 @@
|
|
1
|
+
from typing_extensions import TypedDict
|
2
|
+
|
3
|
+
from lfx.base.models.model import LCModelComponent
|
4
|
+
from lfx.inputs.inputs import InputTypes, SecretStrInput
|
5
|
+
from lfx.template.field.base import Input
|
6
|
+
|
7
|
+
|
8
|
+
class ModelProvidersDict(TypedDict):
|
9
|
+
fields: dict
|
10
|
+
inputs: list[InputTypes]
|
11
|
+
prefix: str
|
12
|
+
component_class: LCModelComponent
|
13
|
+
icon: str
|
14
|
+
is_active: bool
|
15
|
+
|
16
|
+
|
17
|
+
def get_filtered_inputs(component_class):
|
18
|
+
base_input_names = {field.name for field in LCModelComponent.get_base_inputs()}
|
19
|
+
component_instance = component_class()
|
20
|
+
|
21
|
+
return [process_inputs(input_) for input_ in component_instance.inputs if input_.name not in base_input_names]
|
22
|
+
|
23
|
+
|
24
|
+
def process_inputs(component_data: Input):
|
25
|
+
"""Processes and modifies an input configuration based on its type or name.
|
26
|
+
|
27
|
+
Adjusts properties such as value, advanced status, real-time refresh, and additional information for specific
|
28
|
+
input types or names to ensure correct behavior in the UI and provider integration.
|
29
|
+
|
30
|
+
Args:
|
31
|
+
component_data: The input configuration to process.
|
32
|
+
|
33
|
+
Returns:
|
34
|
+
The modified input configuration.
|
35
|
+
"""
|
36
|
+
if isinstance(component_data, SecretStrInput):
|
37
|
+
component_data.value = ""
|
38
|
+
component_data.load_from_db = False
|
39
|
+
component_data.real_time_refresh = True
|
40
|
+
if component_data.name == "api_key":
|
41
|
+
component_data.required = False
|
42
|
+
elif component_data.name == "tool_model_enabled":
|
43
|
+
component_data.advanced = True
|
44
|
+
component_data.value = True
|
45
|
+
elif component_data.name in {"temperature", "base_url"}:
|
46
|
+
component_data = set_advanced_true(component_data)
|
47
|
+
elif component_data.name == "model_name":
|
48
|
+
component_data = set_real_time_refresh_false(component_data)
|
49
|
+
component_data = add_combobox_true(component_data)
|
50
|
+
component_data = add_info(
|
51
|
+
component_data,
|
52
|
+
"To see the model names, first choose a provider. Then, enter your API key and click the refresh button "
|
53
|
+
"next to the model name.",
|
54
|
+
)
|
55
|
+
return component_data
|
56
|
+
|
57
|
+
|
58
|
+
def set_advanced_true(component_input):
|
59
|
+
component_input.advanced = True
|
60
|
+
return component_input
|
61
|
+
|
62
|
+
|
63
|
+
def set_real_time_refresh_false(component_input):
|
64
|
+
component_input.real_time_refresh = False
|
65
|
+
return component_input
|
66
|
+
|
67
|
+
|
68
|
+
def add_info(component_input, info_str: str):
|
69
|
+
component_input.info = info_str
|
70
|
+
return component_input
|
71
|
+
|
72
|
+
|
73
|
+
def add_combobox_true(component_input):
|
74
|
+
component_input.combobox = True
|
75
|
+
return component_input
|
76
|
+
|
77
|
+
|
78
|
+
def create_input_fields_dict(inputs: list[Input], prefix: str) -> dict[str, Input]:
|
79
|
+
return {f"{prefix}{input_.name}": input_.to_dict() for input_ in inputs}
|
80
|
+
|
81
|
+
|
82
|
+
def _get_google_generative_ai_inputs_and_fields():
|
83
|
+
try:
|
84
|
+
from lfx.components.google.google_generative_ai import GoogleGenerativeAIComponent
|
85
|
+
|
86
|
+
google_generative_ai_inputs = get_filtered_inputs(GoogleGenerativeAIComponent)
|
87
|
+
except ImportError as e:
|
88
|
+
msg = (
|
89
|
+
"Google Generative AI is not installed. Please install it with "
|
90
|
+
"`pip install langchain-google-generative-ai`."
|
91
|
+
)
|
92
|
+
raise ImportError(msg) from e
|
93
|
+
return google_generative_ai_inputs, create_input_fields_dict(google_generative_ai_inputs, "")
|
94
|
+
|
95
|
+
|
96
|
+
def _get_openai_inputs_and_fields():
|
97
|
+
try:
|
98
|
+
from lfx.components.openai.openai_chat_model import OpenAIModelComponent
|
99
|
+
|
100
|
+
openai_inputs = get_filtered_inputs(OpenAIModelComponent)
|
101
|
+
except ImportError as e:
|
102
|
+
msg = "OpenAI is not installed. Please install it with `pip install langchain-openai`."
|
103
|
+
raise ImportError(msg) from e
|
104
|
+
return openai_inputs, create_input_fields_dict(openai_inputs, "")
|
105
|
+
|
106
|
+
|
107
|
+
def _get_azure_inputs_and_fields():
|
108
|
+
try:
|
109
|
+
from lfx.components.azure.azure_openai import AzureChatOpenAIComponent
|
110
|
+
|
111
|
+
azure_inputs = get_filtered_inputs(AzureChatOpenAIComponent)
|
112
|
+
except ImportError as e:
|
113
|
+
msg = "Azure OpenAI is not installed. Please install it with `pip install langchain-azure-openai`."
|
114
|
+
raise ImportError(msg) from e
|
115
|
+
return azure_inputs, create_input_fields_dict(azure_inputs, "")
|
116
|
+
|
117
|
+
|
118
|
+
def _get_groq_inputs_and_fields():
|
119
|
+
try:
|
120
|
+
from lfx.components.groq.groq import GroqModel
|
121
|
+
|
122
|
+
groq_inputs = get_filtered_inputs(GroqModel)
|
123
|
+
except ImportError as e:
|
124
|
+
msg = "Groq is not installed. Please install it with `pip install langchain-groq`."
|
125
|
+
raise ImportError(msg) from e
|
126
|
+
return groq_inputs, create_input_fields_dict(groq_inputs, "")
|
127
|
+
|
128
|
+
|
129
|
+
def _get_anthropic_inputs_and_fields():
|
130
|
+
try:
|
131
|
+
from lfx.components.anthropic.anthropic import AnthropicModelComponent
|
132
|
+
|
133
|
+
anthropic_inputs = get_filtered_inputs(AnthropicModelComponent)
|
134
|
+
except ImportError as e:
|
135
|
+
msg = "Anthropic is not installed. Please install it with `pip install langchain-anthropic`."
|
136
|
+
raise ImportError(msg) from e
|
137
|
+
return anthropic_inputs, create_input_fields_dict(anthropic_inputs, "")
|
138
|
+
|
139
|
+
|
140
|
+
def _get_nvidia_inputs_and_fields():
|
141
|
+
try:
|
142
|
+
from lfx.components.nvidia.nvidia import NVIDIAModelComponent
|
143
|
+
|
144
|
+
nvidia_inputs = get_filtered_inputs(NVIDIAModelComponent)
|
145
|
+
except ImportError as e:
|
146
|
+
msg = "NVIDIA is not installed. Please install it with `pip install langchain-nvidia`."
|
147
|
+
raise ImportError(msg) from e
|
148
|
+
return nvidia_inputs, create_input_fields_dict(nvidia_inputs, "")
|
149
|
+
|
150
|
+
|
151
|
+
def _get_amazon_bedrock_inputs_and_fields():
|
152
|
+
try:
|
153
|
+
from lfx.components.amazon.amazon_bedrock_model import AmazonBedrockComponent
|
154
|
+
|
155
|
+
amazon_bedrock_inputs = get_filtered_inputs(AmazonBedrockComponent)
|
156
|
+
except ImportError as e:
|
157
|
+
msg = "Amazon Bedrock is not installed. Please install it with `pip install langchain-amazon-bedrock`."
|
158
|
+
raise ImportError(msg) from e
|
159
|
+
return amazon_bedrock_inputs, create_input_fields_dict(amazon_bedrock_inputs, "")
|
160
|
+
|
161
|
+
|
162
|
+
def _get_sambanova_inputs_and_fields():
|
163
|
+
try:
|
164
|
+
from lfx.components.sambanova.sambanova import SambaNovaComponent
|
165
|
+
|
166
|
+
sambanova_inputs = get_filtered_inputs(SambaNovaComponent)
|
167
|
+
except ImportError as e:
|
168
|
+
msg = "SambaNova is not installed. Please install it with `pip install langchain-sambanova`."
|
169
|
+
raise ImportError(msg) from e
|
170
|
+
return sambanova_inputs, create_input_fields_dict(sambanova_inputs, "")
|
171
|
+
|
172
|
+
|
173
|
+
MODEL_PROVIDERS_DICT: dict[str, ModelProvidersDict] = {}
|
174
|
+
|
175
|
+
# Try to add each provider
|
176
|
+
try:
|
177
|
+
from lfx.components.openai.openai_chat_model import OpenAIModelComponent
|
178
|
+
|
179
|
+
openai_inputs, openai_fields = _get_openai_inputs_and_fields()
|
180
|
+
MODEL_PROVIDERS_DICT["OpenAI"] = {
|
181
|
+
"fields": openai_fields,
|
182
|
+
"inputs": openai_inputs,
|
183
|
+
"prefix": "",
|
184
|
+
"component_class": OpenAIModelComponent(),
|
185
|
+
"icon": OpenAIModelComponent.icon,
|
186
|
+
"is_active": True,
|
187
|
+
}
|
188
|
+
except ImportError:
|
189
|
+
pass
|
190
|
+
|
191
|
+
try:
|
192
|
+
from lfx.components.azure.azure_openai import AzureChatOpenAIComponent
|
193
|
+
|
194
|
+
azure_inputs, azure_fields = _get_azure_inputs_and_fields()
|
195
|
+
MODEL_PROVIDERS_DICT["Azure OpenAI"] = {
|
196
|
+
"fields": azure_fields,
|
197
|
+
"inputs": azure_inputs,
|
198
|
+
"prefix": "",
|
199
|
+
"component_class": AzureChatOpenAIComponent(),
|
200
|
+
"icon": AzureChatOpenAIComponent.icon,
|
201
|
+
"is_active": False,
|
202
|
+
}
|
203
|
+
except ImportError:
|
204
|
+
pass
|
205
|
+
|
206
|
+
try:
|
207
|
+
from lfx.components.groq.groq import GroqModel
|
208
|
+
|
209
|
+
groq_inputs, groq_fields = _get_groq_inputs_and_fields()
|
210
|
+
MODEL_PROVIDERS_DICT["Groq"] = {
|
211
|
+
"fields": groq_fields,
|
212
|
+
"inputs": groq_inputs,
|
213
|
+
"prefix": "",
|
214
|
+
"component_class": GroqModel(),
|
215
|
+
"icon": GroqModel.icon,
|
216
|
+
"is_active": True,
|
217
|
+
}
|
218
|
+
except ImportError:
|
219
|
+
pass
|
220
|
+
|
221
|
+
try:
|
222
|
+
from lfx.components.anthropic.anthropic import AnthropicModelComponent
|
223
|
+
|
224
|
+
anthropic_inputs, anthropic_fields = _get_anthropic_inputs_and_fields()
|
225
|
+
MODEL_PROVIDERS_DICT["Anthropic"] = {
|
226
|
+
"fields": anthropic_fields,
|
227
|
+
"inputs": anthropic_inputs,
|
228
|
+
"prefix": "",
|
229
|
+
"component_class": AnthropicModelComponent(),
|
230
|
+
"icon": AnthropicModelComponent.icon,
|
231
|
+
"is_active": True,
|
232
|
+
}
|
233
|
+
except ImportError:
|
234
|
+
pass
|
235
|
+
|
236
|
+
try:
|
237
|
+
from lfx.components.nvidia.nvidia import NVIDIAModelComponent
|
238
|
+
|
239
|
+
nvidia_inputs, nvidia_fields = _get_nvidia_inputs_and_fields()
|
240
|
+
MODEL_PROVIDERS_DICT["NVIDIA"] = {
|
241
|
+
"fields": nvidia_fields,
|
242
|
+
"inputs": nvidia_inputs,
|
243
|
+
"prefix": "",
|
244
|
+
"component_class": NVIDIAModelComponent(),
|
245
|
+
"icon": NVIDIAModelComponent.icon,
|
246
|
+
"is_active": False,
|
247
|
+
}
|
248
|
+
except ImportError:
|
249
|
+
pass
|
250
|
+
|
251
|
+
try:
|
252
|
+
from lfx.components.amazon.amazon_bedrock_model import AmazonBedrockComponent
|
253
|
+
|
254
|
+
bedrock_inputs, bedrock_fields = _get_amazon_bedrock_inputs_and_fields()
|
255
|
+
MODEL_PROVIDERS_DICT["Amazon Bedrock"] = {
|
256
|
+
"fields": bedrock_fields,
|
257
|
+
"inputs": bedrock_inputs,
|
258
|
+
"prefix": "",
|
259
|
+
"component_class": AmazonBedrockComponent(),
|
260
|
+
"icon": AmazonBedrockComponent.icon,
|
261
|
+
"is_active": False,
|
262
|
+
}
|
263
|
+
except ImportError:
|
264
|
+
pass
|
265
|
+
|
266
|
+
try:
|
267
|
+
from lfx.components.google.google_generative_ai import GoogleGenerativeAIComponent
|
268
|
+
|
269
|
+
google_generative_ai_inputs, google_generative_ai_fields = _get_google_generative_ai_inputs_and_fields()
|
270
|
+
MODEL_PROVIDERS_DICT["Google Generative AI"] = {
|
271
|
+
"fields": google_generative_ai_fields,
|
272
|
+
"inputs": google_generative_ai_inputs,
|
273
|
+
"prefix": "",
|
274
|
+
"component_class": GoogleGenerativeAIComponent(),
|
275
|
+
"icon": GoogleGenerativeAIComponent.icon,
|
276
|
+
"is_active": True,
|
277
|
+
}
|
278
|
+
except ImportError:
|
279
|
+
pass
|
280
|
+
|
281
|
+
try:
|
282
|
+
from lfx.components.sambanova.sambanova import SambaNovaComponent
|
283
|
+
|
284
|
+
sambanova_inputs, sambanova_fields = _get_sambanova_inputs_and_fields()
|
285
|
+
MODEL_PROVIDERS_DICT["SambaNova"] = {
|
286
|
+
"fields": sambanova_fields,
|
287
|
+
"inputs": sambanova_inputs,
|
288
|
+
"prefix": "",
|
289
|
+
"component_class": SambaNovaComponent(),
|
290
|
+
"icon": SambaNovaComponent.icon,
|
291
|
+
"is_active": False,
|
292
|
+
}
|
293
|
+
except ImportError:
|
294
|
+
pass
|
295
|
+
|
296
|
+
# Expose only active providers ----------------------------------------------
|
297
|
+
ACTIVE_MODEL_PROVIDERS_DICT: dict[str, ModelProvidersDict] = {
|
298
|
+
name: prov for name, prov in MODEL_PROVIDERS_DICT.items() if prov.get("is_active", True)
|
299
|
+
}
|
300
|
+
|
301
|
+
MODEL_PROVIDERS: list[str] = list(ACTIVE_MODEL_PROVIDERS_DICT.keys())
|
302
|
+
|
303
|
+
ALL_PROVIDER_FIELDS: list[str] = [field for prov in ACTIVE_MODEL_PROVIDERS_DICT.values() for field in prov["fields"]]
|
304
|
+
|
305
|
+
MODEL_DYNAMIC_UPDATE_FIELDS = ["api_key", "model", "tool_model_enabled", "base_url", "model_name"]
|
306
|
+
|
307
|
+
MODELS_METADATA = {name: {"icon": prov["icon"]} for name, prov in ACTIVE_MODEL_PROVIDERS_DICT.items()}
|