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,34 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from lfx.components._importing import import_mod
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from lfx.components.notdiamond.notdiamond import NotDiamondComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"NotDiamondComponent": "notdiamond",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = [
|
|
15
|
+
"NotDiamondComponent",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def __getattr__(attr_name: str) -> Any:
|
|
20
|
+
"""Lazily import notdiamond components on attribute access."""
|
|
21
|
+
if attr_name not in _dynamic_imports:
|
|
22
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
23
|
+
raise AttributeError(msg)
|
|
24
|
+
try:
|
|
25
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
26
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
27
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
28
|
+
raise AttributeError(msg) from e
|
|
29
|
+
globals()[attr_name] = result
|
|
30
|
+
return result
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def __dir__() -> list[str]:
|
|
34
|
+
return list(__all__)
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import warnings
|
|
2
|
+
|
|
3
|
+
import requests
|
|
4
|
+
from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, SystemMessage
|
|
5
|
+
from pydantic.v1 import SecretStr
|
|
6
|
+
|
|
7
|
+
from lfx.base.models.chat_result import get_chat_result
|
|
8
|
+
from lfx.base.models.model_utils import get_model_name
|
|
9
|
+
from lfx.custom.custom_component.component import Component
|
|
10
|
+
from lfx.io import (
|
|
11
|
+
BoolInput,
|
|
12
|
+
DropdownInput,
|
|
13
|
+
HandleInput,
|
|
14
|
+
MessageInput,
|
|
15
|
+
MessageTextInput,
|
|
16
|
+
Output,
|
|
17
|
+
SecretStrInput,
|
|
18
|
+
StrInput,
|
|
19
|
+
)
|
|
20
|
+
from lfx.schema.message import Message
|
|
21
|
+
|
|
22
|
+
ND_MODEL_MAPPING = {
|
|
23
|
+
"gpt-4o": {"provider": "openai", "model": "gpt-4o"},
|
|
24
|
+
"gpt-4o-mini": {"provider": "openai", "model": "gpt-4o-mini"},
|
|
25
|
+
"gpt-4-turbo": {"provider": "openai", "model": "gpt-4-turbo-2024-04-09"},
|
|
26
|
+
"claude-3-5-haiku-20241022": {"provider": "anthropic", "model": "claude-3-5-haiku-20241022"},
|
|
27
|
+
"claude-3-5-sonnet-20241022": {"provider": "anthropic", "model": "claude-3-5-sonnet-20241022"},
|
|
28
|
+
"anthropic.claude-3-5-sonnet-20241022-v2:0": {"provider": "anthropic", "model": "claude-3-5-sonnet-20241022"},
|
|
29
|
+
"anthropic.claude-3-5-haiku-20241022-v1:0": {"provider": "anthropic", "model": "claude-3-5-haiku-20241022"},
|
|
30
|
+
"gemini-1.5-pro": {"provider": "google", "model": "gemini-1.5-pro-latest"},
|
|
31
|
+
"gemini-1.5-flash": {"provider": "google", "model": "gemini-1.5-flash-latest"},
|
|
32
|
+
"llama-3.1-sonar-large-128k-online": {"provider": "perplexity", "model": "llama-3.1-sonar-large-128k-online"},
|
|
33
|
+
"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo": {
|
|
34
|
+
"provider": "togetherai",
|
|
35
|
+
"model": "Meta-Llama-3.1-70B-Instruct-Turbo",
|
|
36
|
+
},
|
|
37
|
+
"meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo": {
|
|
38
|
+
"provider": "togetherai",
|
|
39
|
+
"model": "Meta-Llama-3.1-405B-Instruct-Turbo",
|
|
40
|
+
},
|
|
41
|
+
"mistral-large-latest": {"provider": "mistral", "model": "mistral-large-2407"},
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class NotDiamondComponent(Component):
|
|
46
|
+
display_name = "Not Diamond Router"
|
|
47
|
+
description = "Call the right model at the right time with the world's most powerful AI model router."
|
|
48
|
+
documentation: str = "https://docs.notdiamond.ai/"
|
|
49
|
+
icon = "NotDiamond"
|
|
50
|
+
name = "NotDiamond"
|
|
51
|
+
|
|
52
|
+
def __init__(self, *args, **kwargs):
|
|
53
|
+
super().__init__(*args, **kwargs)
|
|
54
|
+
self._selected_model_name = None
|
|
55
|
+
|
|
56
|
+
inputs = [
|
|
57
|
+
MessageInput(name="input_value", display_name="Input", required=True),
|
|
58
|
+
MessageTextInput(
|
|
59
|
+
name="system_message",
|
|
60
|
+
display_name="System Message",
|
|
61
|
+
info="System message to pass to the model.",
|
|
62
|
+
advanced=False,
|
|
63
|
+
),
|
|
64
|
+
HandleInput(
|
|
65
|
+
name="models",
|
|
66
|
+
display_name="Language Models",
|
|
67
|
+
input_types=["LanguageModel"],
|
|
68
|
+
required=True,
|
|
69
|
+
is_list=True,
|
|
70
|
+
info="Link the models you want to route between.",
|
|
71
|
+
),
|
|
72
|
+
SecretStrInput(
|
|
73
|
+
name="api_key",
|
|
74
|
+
display_name="Not Diamond API Key",
|
|
75
|
+
info="The Not Diamond API Key to use for routing.",
|
|
76
|
+
advanced=False,
|
|
77
|
+
value="NOTDIAMOND_API_KEY",
|
|
78
|
+
required=True,
|
|
79
|
+
),
|
|
80
|
+
StrInput(
|
|
81
|
+
name="preference_id",
|
|
82
|
+
display_name="Preference ID",
|
|
83
|
+
info="The ID of the router preference that was configured via the Dashboard.",
|
|
84
|
+
advanced=False,
|
|
85
|
+
),
|
|
86
|
+
DropdownInput(
|
|
87
|
+
name="tradeoff",
|
|
88
|
+
display_name="Tradeoff",
|
|
89
|
+
info="The tradeoff between cost and latency for the router to determine the best LLM for a given query.",
|
|
90
|
+
advanced=False,
|
|
91
|
+
options=["quality", "cost", "latency"],
|
|
92
|
+
value="quality",
|
|
93
|
+
),
|
|
94
|
+
BoolInput(
|
|
95
|
+
name="hash_content",
|
|
96
|
+
display_name="Hash Content",
|
|
97
|
+
info="Whether to hash the content before being sent to the NotDiamond API.",
|
|
98
|
+
advanced=False,
|
|
99
|
+
value=False,
|
|
100
|
+
),
|
|
101
|
+
]
|
|
102
|
+
|
|
103
|
+
outputs = [
|
|
104
|
+
Output(display_name="Output", name="output", method="model_select"),
|
|
105
|
+
Output(
|
|
106
|
+
display_name="Selected Model",
|
|
107
|
+
name="selected_model",
|
|
108
|
+
method="get_selected_model",
|
|
109
|
+
required_inputs=["output"],
|
|
110
|
+
),
|
|
111
|
+
]
|
|
112
|
+
|
|
113
|
+
def get_selected_model(self) -> str:
|
|
114
|
+
return self._selected_model_name
|
|
115
|
+
|
|
116
|
+
def model_select(self) -> Message:
|
|
117
|
+
api_key = SecretStr(self.api_key).get_secret_value() if self.api_key else None
|
|
118
|
+
input_value = self.input_value
|
|
119
|
+
system_message = self.system_message
|
|
120
|
+
messages = self._format_input(input_value, system_message)
|
|
121
|
+
|
|
122
|
+
selected_models = []
|
|
123
|
+
mapped_selected_models = []
|
|
124
|
+
for model in self.models:
|
|
125
|
+
model_name = get_model_name(model)
|
|
126
|
+
|
|
127
|
+
if model_name in ND_MODEL_MAPPING:
|
|
128
|
+
selected_models.append(model)
|
|
129
|
+
mapped_selected_models.append(ND_MODEL_MAPPING[model_name])
|
|
130
|
+
|
|
131
|
+
payload = {
|
|
132
|
+
"messages": messages,
|
|
133
|
+
"llm_providers": mapped_selected_models,
|
|
134
|
+
"hash_content": self.hash_content,
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if self.tradeoff != "quality":
|
|
138
|
+
payload["tradeoff"] = self.tradeoff
|
|
139
|
+
|
|
140
|
+
if self.preference_id and self.preference_id != "":
|
|
141
|
+
payload["preference_id"] = self.preference_id
|
|
142
|
+
|
|
143
|
+
header = {
|
|
144
|
+
"Authorization": f"Bearer {api_key}",
|
|
145
|
+
"accept": "application/json",
|
|
146
|
+
"content-type": "application/json",
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
response = requests.post(
|
|
150
|
+
"https://api.notdiamond.ai/v2/modelRouter/modelSelect",
|
|
151
|
+
json=payload,
|
|
152
|
+
headers=header,
|
|
153
|
+
timeout=10,
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
result = response.json()
|
|
157
|
+
chosen_model = self.models[0] # By default there is a fallback model
|
|
158
|
+
self._selected_model_name = get_model_name(chosen_model)
|
|
159
|
+
|
|
160
|
+
if "providers" not in result:
|
|
161
|
+
# No provider returned by NotDiamond API, likely failed. Fallback to first model.
|
|
162
|
+
return self._call_get_chat_result(chosen_model, input_value, system_message)
|
|
163
|
+
|
|
164
|
+
providers = result["providers"]
|
|
165
|
+
|
|
166
|
+
if len(providers) == 0:
|
|
167
|
+
# No provider returned by NotDiamond API, likely failed. Fallback to first model.
|
|
168
|
+
return self._call_get_chat_result(chosen_model, input_value, system_message)
|
|
169
|
+
|
|
170
|
+
nd_result = providers[0]
|
|
171
|
+
|
|
172
|
+
for nd_model, selected_model in zip(mapped_selected_models, selected_models, strict=False):
|
|
173
|
+
if nd_model["provider"] == nd_result["provider"] and nd_model["model"] == nd_result["model"]:
|
|
174
|
+
chosen_model = selected_model
|
|
175
|
+
self._selected_model_name = get_model_name(chosen_model)
|
|
176
|
+
break
|
|
177
|
+
|
|
178
|
+
return self._call_get_chat_result(chosen_model, input_value, system_message)
|
|
179
|
+
|
|
180
|
+
def _call_get_chat_result(self, chosen_model, input_value, system_message):
|
|
181
|
+
return get_chat_result(
|
|
182
|
+
runnable=chosen_model,
|
|
183
|
+
input_value=input_value,
|
|
184
|
+
system_message=system_message,
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
def _format_input(
|
|
188
|
+
self,
|
|
189
|
+
input_value: str | Message,
|
|
190
|
+
system_message: str | None = None,
|
|
191
|
+
):
|
|
192
|
+
messages: list[BaseMessage] = []
|
|
193
|
+
if not input_value and not system_message:
|
|
194
|
+
msg = "The message you want to send to the router is empty."
|
|
195
|
+
raise ValueError(msg)
|
|
196
|
+
system_message_added = False
|
|
197
|
+
if input_value:
|
|
198
|
+
if isinstance(input_value, Message):
|
|
199
|
+
with warnings.catch_warnings():
|
|
200
|
+
warnings.simplefilter("ignore")
|
|
201
|
+
if "prompt" in input_value:
|
|
202
|
+
prompt = input_value.load_lc_prompt()
|
|
203
|
+
if system_message:
|
|
204
|
+
prompt.messages = [
|
|
205
|
+
SystemMessage(content=system_message),
|
|
206
|
+
*prompt.messages, # type: ignore[has-type]
|
|
207
|
+
]
|
|
208
|
+
system_message_added = True
|
|
209
|
+
messages.extend(prompt.messages)
|
|
210
|
+
else:
|
|
211
|
+
messages.append(input_value.to_lc_message())
|
|
212
|
+
else:
|
|
213
|
+
messages.append(HumanMessage(content=input_value))
|
|
214
|
+
|
|
215
|
+
if system_message and not system_message_added:
|
|
216
|
+
messages.insert(0, SystemMessage(content=system_message))
|
|
217
|
+
|
|
218
|
+
# Convert Langchain messages to OpenAI format
|
|
219
|
+
openai_messages = []
|
|
220
|
+
for msg in messages:
|
|
221
|
+
if isinstance(msg, HumanMessage):
|
|
222
|
+
openai_messages.append({"role": "user", "content": msg.content})
|
|
223
|
+
elif isinstance(msg, AIMessage):
|
|
224
|
+
openai_messages.append({"role": "assistant", "content": msg.content})
|
|
225
|
+
elif isinstance(msg, SystemMessage):
|
|
226
|
+
openai_messages.append({"role": "system", "content": msg.content})
|
|
227
|
+
|
|
228
|
+
return openai_messages
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any
|
|
4
|
+
|
|
5
|
+
from lfx.components._importing import import_mod
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from lfx.components.novita.novita import NovitaModelComponent
|
|
9
|
+
|
|
10
|
+
_dynamic_imports = {
|
|
11
|
+
"NovitaModelComponent": "novita",
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
__all__ = ["NovitaModelComponent"]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def __getattr__(attr_name: str) -> Any:
|
|
18
|
+
"""Lazily import novita components on attribute access."""
|
|
19
|
+
if attr_name not in _dynamic_imports:
|
|
20
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
21
|
+
raise AttributeError(msg)
|
|
22
|
+
try:
|
|
23
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
24
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
25
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
26
|
+
raise AttributeError(msg) from e
|
|
27
|
+
globals()[attr_name] = result
|
|
28
|
+
return result
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def __dir__() -> list[str]:
|
|
32
|
+
return list(__all__)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
from langchain_openai import ChatOpenAI
|
|
3
|
+
from pydantic.v1 import SecretStr
|
|
4
|
+
from typing_extensions import override
|
|
5
|
+
|
|
6
|
+
from lfx.base.models.model import LCModelComponent
|
|
7
|
+
from lfx.base.models.novita_constants import MODEL_NAMES
|
|
8
|
+
from lfx.field_typing import LanguageModel
|
|
9
|
+
from lfx.field_typing.range_spec import RangeSpec
|
|
10
|
+
from lfx.inputs.inputs import (
|
|
11
|
+
BoolInput,
|
|
12
|
+
DictInput,
|
|
13
|
+
DropdownInput,
|
|
14
|
+
HandleInput,
|
|
15
|
+
IntInput,
|
|
16
|
+
SecretStrInput,
|
|
17
|
+
SliderInput,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class NovitaModelComponent(LCModelComponent):
|
|
22
|
+
display_name = "Novita AI"
|
|
23
|
+
description = "Generates text using Novita AI LLMs (OpenAI compatible)."
|
|
24
|
+
icon = "Novita"
|
|
25
|
+
name = "NovitaModel"
|
|
26
|
+
|
|
27
|
+
inputs = [
|
|
28
|
+
*LCModelComponent.get_base_inputs(),
|
|
29
|
+
IntInput(
|
|
30
|
+
name="max_tokens",
|
|
31
|
+
display_name="Max Tokens",
|
|
32
|
+
advanced=True,
|
|
33
|
+
info="The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
|
|
34
|
+
range_spec=RangeSpec(min=0, max=128000),
|
|
35
|
+
),
|
|
36
|
+
DictInput(
|
|
37
|
+
name="model_kwargs",
|
|
38
|
+
display_name="Model Kwargs",
|
|
39
|
+
advanced=True,
|
|
40
|
+
info="Additional keyword arguments to pass to the model.",
|
|
41
|
+
),
|
|
42
|
+
BoolInput(
|
|
43
|
+
name="json_mode",
|
|
44
|
+
display_name="JSON Mode",
|
|
45
|
+
advanced=True,
|
|
46
|
+
info="If True, it will output JSON regardless of passing a schema.",
|
|
47
|
+
),
|
|
48
|
+
DropdownInput(
|
|
49
|
+
name="model_name",
|
|
50
|
+
display_name="Model Name",
|
|
51
|
+
advanced=False,
|
|
52
|
+
options=MODEL_NAMES,
|
|
53
|
+
value=MODEL_NAMES[0],
|
|
54
|
+
refresh_button=True,
|
|
55
|
+
),
|
|
56
|
+
SecretStrInput(
|
|
57
|
+
name="api_key",
|
|
58
|
+
display_name="Novita API Key",
|
|
59
|
+
info="The Novita API Key to use for Novita AI models.",
|
|
60
|
+
advanced=False,
|
|
61
|
+
value="NOVITA_API_KEY",
|
|
62
|
+
real_time_refresh=True,
|
|
63
|
+
),
|
|
64
|
+
SliderInput(name="temperature", display_name="Temperature", value=0.1, range_spec=RangeSpec(min=0, max=1)),
|
|
65
|
+
IntInput(
|
|
66
|
+
name="seed",
|
|
67
|
+
display_name="Seed",
|
|
68
|
+
info="The seed controls the reproducibility of the job.",
|
|
69
|
+
advanced=True,
|
|
70
|
+
value=1,
|
|
71
|
+
),
|
|
72
|
+
HandleInput(
|
|
73
|
+
name="output_parser",
|
|
74
|
+
display_name="Output Parser",
|
|
75
|
+
info="The parser to use to parse the output of the model",
|
|
76
|
+
advanced=True,
|
|
77
|
+
input_types=["OutputParser"],
|
|
78
|
+
),
|
|
79
|
+
]
|
|
80
|
+
|
|
81
|
+
def get_models(self) -> list[str]:
|
|
82
|
+
base_url = "https://api.novita.ai/v3/openai"
|
|
83
|
+
url = f"{base_url}/models"
|
|
84
|
+
|
|
85
|
+
headers = {"Content-Type": "application/json"}
|
|
86
|
+
|
|
87
|
+
try:
|
|
88
|
+
response = requests.get(url, headers=headers, timeout=10)
|
|
89
|
+
response.raise_for_status()
|
|
90
|
+
model_list = response.json()
|
|
91
|
+
return [model["id"] for model in model_list.get("data", [])]
|
|
92
|
+
except requests.RequestException as e:
|
|
93
|
+
self.status = f"Error fetching models: {e}"
|
|
94
|
+
return MODEL_NAMES
|
|
95
|
+
|
|
96
|
+
@override
|
|
97
|
+
def update_build_config(self, build_config: dict, field_value: str, field_name: str | None = None):
|
|
98
|
+
if field_name in {"api_key", "model_name"}:
|
|
99
|
+
models = self.get_models()
|
|
100
|
+
build_config["model_name"]["options"] = models
|
|
101
|
+
return build_config
|
|
102
|
+
|
|
103
|
+
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
|
104
|
+
api_key = self.api_key
|
|
105
|
+
temperature = self.temperature
|
|
106
|
+
model_name: str = self.model_name
|
|
107
|
+
max_tokens = self.max_tokens
|
|
108
|
+
model_kwargs = self.model_kwargs or {}
|
|
109
|
+
json_mode = self.json_mode
|
|
110
|
+
seed = self.seed
|
|
111
|
+
|
|
112
|
+
try:
|
|
113
|
+
output = ChatOpenAI(
|
|
114
|
+
model=model_name,
|
|
115
|
+
api_key=(SecretStr(api_key).get_secret_value() if api_key else None),
|
|
116
|
+
max_tokens=max_tokens or None,
|
|
117
|
+
temperature=temperature,
|
|
118
|
+
model_kwargs=model_kwargs,
|
|
119
|
+
streaming=self.stream,
|
|
120
|
+
seed=seed,
|
|
121
|
+
base_url="https://api.novita.ai/v3/openai",
|
|
122
|
+
)
|
|
123
|
+
except Exception as e:
|
|
124
|
+
msg = "Could not connect to Novita API."
|
|
125
|
+
raise ValueError(msg) from e
|
|
126
|
+
|
|
127
|
+
if json_mode:
|
|
128
|
+
output = output.bind(response_format={"type": "json_object"})
|
|
129
|
+
|
|
130
|
+
return output
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
from typing import TYPE_CHECKING, Any
|
|
5
|
+
|
|
6
|
+
from lfx.components._importing import import_mod
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from .nvidia import NVIDIAModelComponent
|
|
10
|
+
from .nvidia_embedding import NVIDIAEmbeddingsComponent
|
|
11
|
+
from .nvidia_ingest import NvidiaIngestComponent
|
|
12
|
+
from .nvidia_rerank import NvidiaRerankComponent
|
|
13
|
+
|
|
14
|
+
if sys.platform == "win32":
|
|
15
|
+
from .system_assist import NvidiaSystemAssistComponent
|
|
16
|
+
|
|
17
|
+
_dynamic_imports = {
|
|
18
|
+
"NVIDIAModelComponent": "nvidia",
|
|
19
|
+
"NVIDIAEmbeddingsComponent": "nvidia_embedding",
|
|
20
|
+
"NvidiaIngestComponent": "nvidia_ingest",
|
|
21
|
+
"NvidiaRerankComponent": "nvidia_rerank",
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if sys.platform == "win32":
|
|
25
|
+
_dynamic_imports["NvidiaSystemAssistComponent"] = "system_assist"
|
|
26
|
+
__all__ = [
|
|
27
|
+
"NVIDIAEmbeddingsComponent",
|
|
28
|
+
"NVIDIAModelComponent",
|
|
29
|
+
"NvidiaIngestComponent",
|
|
30
|
+
"NvidiaRerankComponent",
|
|
31
|
+
"NvidiaSystemAssistComponent",
|
|
32
|
+
]
|
|
33
|
+
else:
|
|
34
|
+
__all__ = [
|
|
35
|
+
"NVIDIAEmbeddingsComponent",
|
|
36
|
+
"NVIDIAModelComponent",
|
|
37
|
+
"NvidiaIngestComponent",
|
|
38
|
+
"NvidiaRerankComponent",
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def __getattr__(attr_name: str) -> Any:
|
|
43
|
+
"""Lazily import nvidia components on attribute access."""
|
|
44
|
+
if attr_name not in _dynamic_imports:
|
|
45
|
+
msg = f"module '{__name__}' has no attribute '{attr_name}'"
|
|
46
|
+
raise AttributeError(msg)
|
|
47
|
+
try:
|
|
48
|
+
result = import_mod(attr_name, _dynamic_imports[attr_name], __spec__.parent)
|
|
49
|
+
except (ModuleNotFoundError, ImportError, AttributeError) as e:
|
|
50
|
+
msg = f"Could not import '{attr_name}' from '{__name__}': {e}"
|
|
51
|
+
raise AttributeError(msg) from e
|
|
52
|
+
globals()[attr_name] = result
|
|
53
|
+
return result
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def __dir__() -> list[str]:
|
|
57
|
+
return list(__all__)
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from lfx.base.models.model import LCModelComponent
|
|
4
|
+
from lfx.field_typing import LanguageModel
|
|
5
|
+
from lfx.field_typing.range_spec import RangeSpec
|
|
6
|
+
from lfx.inputs.inputs import BoolInput, DropdownInput, IntInput, MessageTextInput, SecretStrInput, SliderInput
|
|
7
|
+
from lfx.log.logger import logger
|
|
8
|
+
from lfx.schema.dotdict import dotdict
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class NVIDIAModelComponent(LCModelComponent):
|
|
12
|
+
display_name = "NVIDIA"
|
|
13
|
+
description = "Generates text using NVIDIA LLMs."
|
|
14
|
+
icon = "NVIDIA"
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
import warnings
|
|
18
|
+
|
|
19
|
+
# Suppresses repeated warnings about NIM key in langchain_nvidia_ai_endpoints==0.3.8
|
|
20
|
+
warnings.filterwarnings("ignore", category=UserWarning, module="langchain_nvidia_ai_endpoints._common")
|
|
21
|
+
from langchain_nvidia_ai_endpoints import ChatNVIDIA
|
|
22
|
+
|
|
23
|
+
all_models = ChatNVIDIA().get_available_models()
|
|
24
|
+
except ImportError as e:
|
|
25
|
+
msg = "Please install langchain-nvidia-ai-endpoints to use the NVIDIA model."
|
|
26
|
+
raise ImportError(msg) from e
|
|
27
|
+
except Exception as e: # noqa: BLE001
|
|
28
|
+
logger.warning(f"Failed to fetch NVIDIA models during initialization: {e}. Model list will be unavailable.")
|
|
29
|
+
all_models = []
|
|
30
|
+
|
|
31
|
+
inputs = [
|
|
32
|
+
*LCModelComponent.get_base_inputs(),
|
|
33
|
+
IntInput(
|
|
34
|
+
name="max_tokens",
|
|
35
|
+
display_name="Max Tokens",
|
|
36
|
+
advanced=True,
|
|
37
|
+
info="The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
|
|
38
|
+
),
|
|
39
|
+
DropdownInput(
|
|
40
|
+
name="model_name",
|
|
41
|
+
display_name="Model Name",
|
|
42
|
+
info="The name of the NVIDIA model to use.",
|
|
43
|
+
advanced=False,
|
|
44
|
+
value=None,
|
|
45
|
+
options=sorted(model.id for model in all_models),
|
|
46
|
+
combobox=True,
|
|
47
|
+
refresh_button=True,
|
|
48
|
+
),
|
|
49
|
+
BoolInput(
|
|
50
|
+
name="detailed_thinking",
|
|
51
|
+
display_name="Detailed Thinking",
|
|
52
|
+
info="If true, the model will return a detailed thought process. Only supported by reasoning models.",
|
|
53
|
+
value=False,
|
|
54
|
+
show=False,
|
|
55
|
+
),
|
|
56
|
+
BoolInput(
|
|
57
|
+
name="tool_model_enabled",
|
|
58
|
+
display_name="Enable Tool Models",
|
|
59
|
+
info="If enabled, only show models that support tool-calling.",
|
|
60
|
+
advanced=False,
|
|
61
|
+
value=False,
|
|
62
|
+
real_time_refresh=True,
|
|
63
|
+
),
|
|
64
|
+
MessageTextInput(
|
|
65
|
+
name="base_url",
|
|
66
|
+
display_name="NVIDIA Base URL",
|
|
67
|
+
value="https://integrate.api.nvidia.com/v1",
|
|
68
|
+
info="The base URL of the NVIDIA API. Defaults to https://integrate.api.nvidia.com/v1.",
|
|
69
|
+
),
|
|
70
|
+
SecretStrInput(
|
|
71
|
+
name="api_key",
|
|
72
|
+
display_name="NVIDIA API Key",
|
|
73
|
+
info="The NVIDIA API Key.",
|
|
74
|
+
advanced=False,
|
|
75
|
+
value="NVIDIA_API_KEY",
|
|
76
|
+
),
|
|
77
|
+
SliderInput(
|
|
78
|
+
name="temperature",
|
|
79
|
+
display_name="Temperature",
|
|
80
|
+
value=0.1,
|
|
81
|
+
info="Run inference with this temperature.",
|
|
82
|
+
range_spec=RangeSpec(min=0, max=1, step=0.01),
|
|
83
|
+
advanced=True,
|
|
84
|
+
),
|
|
85
|
+
IntInput(
|
|
86
|
+
name="seed",
|
|
87
|
+
display_name="Seed",
|
|
88
|
+
info="The seed controls the reproducibility of the job.",
|
|
89
|
+
advanced=True,
|
|
90
|
+
value=1,
|
|
91
|
+
),
|
|
92
|
+
]
|
|
93
|
+
|
|
94
|
+
def get_models(self, *, tool_model_enabled: bool | None = None) -> list[str]:
|
|
95
|
+
try:
|
|
96
|
+
from langchain_nvidia_ai_endpoints import ChatNVIDIA
|
|
97
|
+
except ImportError as e:
|
|
98
|
+
msg = "Please install langchain-nvidia-ai-endpoints to use the NVIDIA model."
|
|
99
|
+
raise ImportError(msg) from e
|
|
100
|
+
|
|
101
|
+
# Note: don't include the previous model, as it may not exist in available models from the new base url
|
|
102
|
+
model = ChatNVIDIA(base_url=self.base_url, api_key=self.api_key)
|
|
103
|
+
if tool_model_enabled:
|
|
104
|
+
tool_models = [m for m in model.get_available_models() if m.supports_tools]
|
|
105
|
+
return sorted(m.id for m in tool_models)
|
|
106
|
+
return sorted(m.id for m in model.available_models)
|
|
107
|
+
|
|
108
|
+
def update_build_config(self, build_config: dotdict, _field_value: Any, field_name: str | None = None):
|
|
109
|
+
if field_name in {"model_name", "tool_model_enabled", "base_url", "api_key"}:
|
|
110
|
+
try:
|
|
111
|
+
ids = self.get_models(tool_model_enabled=self.tool_model_enabled)
|
|
112
|
+
build_config["model_name"]["options"] = ids
|
|
113
|
+
|
|
114
|
+
if "value" not in build_config["model_name"] or build_config["model_name"]["value"] is None:
|
|
115
|
+
build_config["model_name"]["value"] = ids[0]
|
|
116
|
+
elif build_config["model_name"]["value"] not in ids:
|
|
117
|
+
build_config["model_name"]["value"] = None
|
|
118
|
+
|
|
119
|
+
# TODO: use api to determine if model supports detailed thinking
|
|
120
|
+
if build_config["model_name"]["value"] == "nemotron":
|
|
121
|
+
build_config["detailed_thinking"]["show"] = True
|
|
122
|
+
else:
|
|
123
|
+
build_config["detailed_thinking"]["value"] = False
|
|
124
|
+
build_config["detailed_thinking"]["show"] = False
|
|
125
|
+
except Exception as e:
|
|
126
|
+
msg = f"Error getting model names: {e}"
|
|
127
|
+
build_config["model_name"]["value"] = None
|
|
128
|
+
build_config["model_name"]["options"] = []
|
|
129
|
+
raise ValueError(msg) from e
|
|
130
|
+
|
|
131
|
+
return build_config
|
|
132
|
+
|
|
133
|
+
def build_model(self) -> LanguageModel: # type: ignore[type-var]
|
|
134
|
+
try:
|
|
135
|
+
from langchain_nvidia_ai_endpoints import ChatNVIDIA
|
|
136
|
+
except ImportError as e:
|
|
137
|
+
msg = "Please install langchain-nvidia-ai-endpoints to use the NVIDIA model."
|
|
138
|
+
raise ImportError(msg) from e
|
|
139
|
+
api_key = self.api_key
|
|
140
|
+
temperature = self.temperature
|
|
141
|
+
model_name: str = self.model_name
|
|
142
|
+
max_tokens = self.max_tokens
|
|
143
|
+
seed = self.seed
|
|
144
|
+
return ChatNVIDIA(
|
|
145
|
+
max_tokens=max_tokens or None,
|
|
146
|
+
model=model_name,
|
|
147
|
+
base_url=self.base_url,
|
|
148
|
+
api_key=api_key,
|
|
149
|
+
temperature=temperature or 0.1,
|
|
150
|
+
seed=seed,
|
|
151
|
+
)
|