From a46eadf2d8956bffa9418886d44c3bea216a2ccd Mon Sep 17 00:00:00 2001 From: Zhijie He Date: Mon, 17 Feb 2025 13:32:38 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20add=20SambaNova=20provider?= =?UTF-8?q?=20support=20(#6218)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ feat: add SambaNova provider support * 🐛 fix: fix build error * 🔨 chore: disable Browser Request & `DeepSeek-R1` model --- Dockerfile | 2 + Dockerfile.database | 2 + .../settings/llm/ProviderList/providers.tsx | 2 + src/config/aiModels/index.ts | 3 + src/config/aiModels/sambanova.ts | 195 ++++++++++++++++++ src/config/llm.ts | 6 + src/config/modelProviders/index.ts | 4 + src/config/modelProviders/sambanova.ts | 18 ++ src/libs/agent-runtime/AgentRuntime.ts | 7 + src/libs/agent-runtime/sambanova/index.ts | 10 + src/libs/agent-runtime/types/type.ts | 1 + src/types/user/settings/keyVaults.ts | 1 + 12 files changed, 251 insertions(+) create mode 100644 src/config/aiModels/sambanova.ts create mode 100644 src/config/modelProviders/sambanova.ts create mode 100644 src/libs/agent-runtime/sambanova/index.ts diff --git a/Dockerfile b/Dockerfile index 880329856a146..679cc846a0d7d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -205,6 +205,8 @@ ENV \ PERPLEXITY_API_KEY="" PERPLEXITY_MODEL_LIST="" PERPLEXITY_PROXY_URL="" \ # Qwen QWEN_API_KEY="" QWEN_MODEL_LIST="" QWEN_PROXY_URL="" \ + # SambaNova + SAMBANOVA_API_KEY="" SAMBANOVA_MODEL_LIST="" \ # SenseNova SENSENOVA_API_KEY="" SENSENOVA_MODEL_LIST="" \ # SiliconCloud diff --git a/Dockerfile.database b/Dockerfile.database index ca05a770cb3d9..b1663ed9fd2c0 100644 --- a/Dockerfile.database +++ b/Dockerfile.database @@ -242,6 +242,8 @@ ENV \ PERPLEXITY_API_KEY="" PERPLEXITY_MODEL_LIST="" PERPLEXITY_PROXY_URL="" \ # Qwen QWEN_API_KEY="" QWEN_MODEL_LIST="" QWEN_PROXY_URL="" \ + # SambaNova + SAMBANOVA_API_KEY="" SAMBANOVA_MODEL_LIST="" \ # SenseNova SENSENOVA_API_KEY="" SENSENOVA_MODEL_LIST="" \ # SiliconCloud diff --git a/src/app/[variants]/(main)/settings/llm/ProviderList/providers.tsx b/src/app/[variants]/(main)/settings/llm/ProviderList/providers.tsx index d321e7423f595..ce36abdab8512 100644 --- a/src/app/[variants]/(main)/settings/llm/ProviderList/providers.tsx +++ b/src/app/[variants]/(main)/settings/llm/ProviderList/providers.tsx @@ -22,6 +22,7 @@ import { OpenRouterProviderCard, PerplexityProviderCard, QwenProviderCard, + SambaNovaProviderCard, SenseNovaProviderCard, SiliconCloudProviderCard, SparkProviderCard, @@ -79,6 +80,7 @@ export const useProviderList = (): ProviderItem[] => { UpstageProviderCard, XAIProviderCard, JinaProviderCard, + SambaNovaProviderCard, QwenProviderCard, WenxinProviderCard, HunyuanProviderCard, diff --git a/src/config/aiModels/index.ts b/src/config/aiModels/index.ts index 73775b723fa65..e3cb3d7414ab3 100644 --- a/src/config/aiModels/index.ts +++ b/src/config/aiModels/index.ts @@ -31,6 +31,7 @@ import { default as openai } from './openai'; import { default as openrouter } from './openrouter'; import { default as perplexity } from './perplexity'; import { default as qwen } from './qwen'; +import { default as sambanova } from './sambanova'; import { default as sensenova } from './sensenova'; import { default as siliconcloud } from './siliconcloud'; import { default as spark } from './spark'; @@ -97,6 +98,7 @@ export const LOBE_DEFAULT_MODEL_LIST = buildDefaultModelList({ openrouter, perplexity, qwen, + sambanova, sensenova, siliconcloud, spark, @@ -144,6 +146,7 @@ export { default as openai } from './openai'; export { default as openrouter } from './openrouter'; export { default as perplexity } from './perplexity'; export { default as qwen } from './qwen'; +export { default as sambanova } from './sambanova'; export { default as sensenova } from './sensenova'; export { default as siliconcloud } from './siliconcloud'; export { default as spark } from './spark'; diff --git a/src/config/aiModels/sambanova.ts b/src/config/aiModels/sambanova.ts new file mode 100644 index 0000000000000..426fd1ae7d13d --- /dev/null +++ b/src/config/aiModels/sambanova.ts @@ -0,0 +1,195 @@ +import { AIChatModelCard } from '@/types/aiModel'; + +const sambanovaChatModels: AIChatModelCard[] = [ + { + abilities: { + functionCall: true, + }, + contextWindowTokens: 16_000, + description: 'Llama 3.3 是 Llama 系列最先进的多语言开源大型语言模型,以极低成本体验媲美 405B 模型的性能。基于 Transformer 结构,并通过监督微调(SFT)和人类反馈强化学习(RLHF)提升有用性和安全性。其指令调优版本专为多语言对话优化,在多项行业基准上表现优于众多开源和封闭聊天模型。知识截止日期为 2023 年 12 月', + displayName: 'Meta Llama 3.3 70B Instruct', + enabled: true, + id: 'Meta-Llama-3.3-70B-Instruct', + pricing: { + input: 0.6, + output: 1.2 + }, + type: 'chat' + }, + { + contextWindowTokens: 16_000, + description: '先进的最尖端小型语言模型,具备语言理解、卓越的推理能力和文本生成能力。', + displayName: 'Meta Llama 3.2 1B Instruct', + id: 'Meta-Llama-3.2-1B-Instruct', + pricing: { + input: 0.04, + output: 0.08 + }, + type: 'chat' + }, + { + contextWindowTokens: 8000, + description: '先进的最尖端小型语言模型,具备语言理解、卓越的推理能力和文本生成能力。', + displayName: 'Meta Llama 3.2 3B Instruct', + id: 'Meta-Llama-3.2-3B-Instruct', + pricing: { + input: 0.08, + output: 0.16 + }, + type: 'chat' + }, + { + abilities: { + vision: true, + }, + contextWindowTokens: 4000, + description: '在高分辨率图像上表现出色的图像推理能力,适用于视觉理解应用。', + displayName: 'Meta Llama 3.2 11B Vision Instruct', + enabled: true, + id: 'Llama-3.2-11B-Vision-Instruct', + pricing: { + input: 0.15, + output: 0.3 + }, + type: 'chat' + }, + { + abilities: { + vision: true, + }, + contextWindowTokens: 4000, + description: '适用于视觉理解代理应用的高级图像推理能力。', + displayName: 'Meta Llama 3.2 90B Vision Instruct', + enabled: true, + id: 'Llama-3.2-90B-Vision-Instruct ', + pricing: { + input: 0.8, + output: 1.6 + }, + type: 'chat' + }, + { + abilities: { + functionCall: true, + }, + contextWindowTokens: 16_000, + description: 'Llama 3.1指令调优的文本模型,针对多语言对话用例进行了优化,在许多可用的开源和封闭聊天模型中,在常见行业基准上表现优异。', + displayName: 'Meta Llama 3.1 8B Instruct', + id: 'Meta-Llama-3.1-8B-Instruct', + pricing: { + input: 0.1, + output: 0.2 + }, + type: 'chat' + }, + { + abilities: { + functionCall: true, + }, + contextWindowTokens: 128_000, + description: 'Llama 3.1指令调优的文本模型,针对多语言对话用例进行了优化,在许多可用的开源和封闭聊天模型中,在常见行业基准上表现优异。', + displayName: 'Meta Llama 3.1 70B Instruct', + id: 'Meta-Llama-3.1-70B-Instruct', + pricing: { + input: 0.6, + output: 1.2 + }, + type: 'chat' + }, + { + abilities: { + functionCall: true, + }, + contextWindowTokens: 16_000, + description: 'Llama 3.1指令调优的文本模型,针对多语言对话用例进行了优化,在许多可用的开源和封闭聊天模型中,在常见行业基准上表现优异。', + displayName: 'Meta Llama 3.1 405B Instruct', + id: 'Meta-Llama-3.1-405B-Instruct', + pricing: { + input: 5, + output: 10 + }, + type: 'chat' + }, + { + contextWindowTokens: 16_000, + displayName: 'Llama 3.1 Tulu 3 405B', + id: 'Llama-3.1-Tulu-3-405B', + pricing: { + input: 0.7, + output: 1.4 + }, + type: 'chat' + }, + { + abilities: { + reasoning: true, + }, + contextWindowTokens: 4000, + description: '最先进的高效 LLM,擅长推理、数学和编程。', + displayName: 'DeepSeek R1', + id: 'DeepSeek-R1', + pricing: { + input: 5, + output: 7 + }, + type: 'chat' + }, + { + abilities: { + reasoning: true, + }, + contextWindowTokens: 32_000, + description: 'DeepSeek R1——DeepSeek 套件中更大更智能的模型——被蒸馏到 Llama 70B 架构中。基于基准测试和人工评估,该模型比原始 Llama 70B 更智能,尤其在需要数学和事实精确性的任务上表现出色。', + displayName: 'DeepSeek R1 Distill Llama 70B', + enabled: true, + id: 'DeepSeek-R1-Distill-Llama-70B', + pricing: { + input: 0.7, + output: 1.4 + }, + type: 'chat' + }, + { + abilities: { + reasoning: true, + }, + contextWindowTokens: 16_000, + description: 'Qwen QwQ 是由 Qwen 团队开发的实验研究模型,专注于提升AI推理能力。', + displayName: 'QwQ 32B Preview', + enabled: true, + id: 'QwQ-32B-Preview', + pricing: { + input: 1.5, + output: 3 + }, + type: 'chat' + }, + { + contextWindowTokens: 16_000, + description: '面向中文和英文的 LLM,针对语言、编程、数学、推理等领域。', + displayName: 'Qwen2.5 72B Instruct', + enabled: true, + id: 'Qwen2.5-72B-Instruct', + pricing: { + input: 2, + output: 4 + }, + type: 'chat' + }, + { + contextWindowTokens: 16_000, + description: '高级 LLM,支持代码生成、推理和修复,涵盖主流编程语言。', + displayName: 'Qwen2.5 Coder 32B Instruct', + enabled: true, + id: 'Qwen2.5-Coder-32B-Instruct', + pricing: { + input: 1.5, + output: 3 + }, + type: 'chat' + }, +] + +export const allModels = [...sambanovaChatModels]; + +export default allModels; diff --git a/src/config/llm.ts b/src/config/llm.ts index 844ea53b8f9ea..11049a74f81c2 100644 --- a/src/config/llm.ts +++ b/src/config/llm.ts @@ -140,6 +140,9 @@ export const getLLMConfig = () => { ENABLED_JINA: z.boolean(), JINA_API_KEY: z.string().optional(), + + ENABLED_SAMBANOVA: z.boolean(), + SAMBANOVA_API_KEY: z.string().optional(), }, runtimeEnv: { API_KEY_SELECT_MODE: process.env.API_KEY_SELECT_MODE, @@ -278,6 +281,9 @@ export const getLLMConfig = () => { ENABLED_JINA: !!process.env.JINA_API_KEY, JINA_API_KEY: process.env.JINA_API_KEY, + + ENABLED_SAMBANOVA: !!process.env.SAMBANOVA_API_KEY, + SAMBANOVA_API_KEY: process.env.SAMBANOVA_API_KEY, }, }); }; diff --git a/src/config/modelProviders/index.ts b/src/config/modelProviders/index.ts index d627554b537f4..9d2e492974dca 100644 --- a/src/config/modelProviders/index.ts +++ b/src/config/modelProviders/index.ts @@ -31,6 +31,7 @@ import OpenAIProvider from './openai'; import OpenRouterProvider from './openrouter'; import PerplexityProvider from './perplexity'; import QwenProvider from './qwen'; +import SambaNovaProvider from './sambanova'; import SenseNovaProvider from './sensenova'; import SiliconCloudProvider from './siliconcloud'; import SparkProvider from './spark'; @@ -71,6 +72,7 @@ export const LOBE_DEFAULT_MODEL_LIST: ChatModelCard[] = [ HuggingFaceProvider.chatModels, XAIProvider.chatModels, JinaProvider.chatModels, + SambaNovaProvider.chatModels, ZeroOneProvider.chatModels, StepfunProvider.chatModels, NovitaProvider.chatModels, @@ -116,6 +118,7 @@ export const DEFAULT_MODEL_PROVIDER_LIST = [ UpstageProvider, XAIProvider, JinaProvider, + SambaNovaProvider, QwenProvider, WenxinProvider, TencentcloudProvider, @@ -179,6 +182,7 @@ export { default as OpenAIProviderCard } from './openai'; export { default as OpenRouterProviderCard } from './openrouter'; export { default as PerplexityProviderCard } from './perplexity'; export { default as QwenProviderCard } from './qwen'; +export { default as SambaNovaProviderCard } from './sambanova'; export { default as SenseNovaProviderCard } from './sensenova'; export { default as SiliconCloudProviderCard } from './siliconcloud'; export { default as SparkProviderCard } from './spark'; diff --git a/src/config/modelProviders/sambanova.ts b/src/config/modelProviders/sambanova.ts new file mode 100644 index 0000000000000..3850df8329f04 --- /dev/null +++ b/src/config/modelProviders/sambanova.ts @@ -0,0 +1,18 @@ +import { ModelProviderCard } from '@/types/llm'; + +const SambaNova: ModelProviderCard = { + chatModels: [], + checkModel: 'Meta-Llama-3.2-1B-Instruct', + description: 'SambaNova Cloud 可让开发者轻松使用最佳的开源模型,并享受最快的推理速度。', + disableBrowserRequest: true, + id: 'sambanova', + modelsUrl: 'https://cloud.sambanova.ai/plans/pricing', + name: 'SambaNova', + settings: { + disableBrowserRequest: true, + sdkType: 'openai', + }, + url: 'https://cloud.sambanova.ai', +}; + +export default SambaNova; diff --git a/src/libs/agent-runtime/AgentRuntime.ts b/src/libs/agent-runtime/AgentRuntime.ts index 2cb788a5952c8..2c56de177f72d 100644 --- a/src/libs/agent-runtime/AgentRuntime.ts +++ b/src/libs/agent-runtime/AgentRuntime.ts @@ -33,6 +33,7 @@ import { LobeOpenAI } from './openai'; import { LobeOpenRouterAI } from './openrouter'; import { LobePerplexityAI } from './perplexity'; import { LobeQwenAI } from './qwen'; +import { LobeSambaNovaAI } from './sambanova'; import { LobeSenseNovaAI } from './sensenova'; import { LobeSiliconCloudAI } from './siliconcloud'; import { LobeSparkAI } from './spark'; @@ -169,6 +170,7 @@ class AgentRuntime { openrouter: Partial; perplexity: Partial; qwen: Partial; + sambanova: Partial; sensenova: Partial; siliconcloud: Partial; spark: Partial; @@ -384,6 +386,11 @@ class AgentRuntime { break; } + case ModelProvider.SambaNova: { + runtimeModel = new LobeSambaNovaAI(params.sambanova); + break; + } + case ModelProvider.Cloudflare: { runtimeModel = new LobeCloudflareAI(params.cloudflare); break; diff --git a/src/libs/agent-runtime/sambanova/index.ts b/src/libs/agent-runtime/sambanova/index.ts new file mode 100644 index 0000000000000..2839251fe09f1 --- /dev/null +++ b/src/libs/agent-runtime/sambanova/index.ts @@ -0,0 +1,10 @@ +import { ModelProvider } from '../types'; +import { LobeOpenAICompatibleFactory } from '../utils/openaiCompatibleFactory'; + +export const LobeSambaNovaAI = LobeOpenAICompatibleFactory({ + baseURL: 'https://api.sambanova.ai/v1', + debug: { + chatCompletion: () => process.env.DEBUG_SAMBANOVA_CHAT_COMPLETION === '1', + }, + provider: ModelProvider.SambaNova, +}); diff --git a/src/libs/agent-runtime/types/type.ts b/src/libs/agent-runtime/types/type.ts index e964f4eaea3bc..78a30f37c7317 100644 --- a/src/libs/agent-runtime/types/type.ts +++ b/src/libs/agent-runtime/types/type.ts @@ -56,6 +56,7 @@ export enum ModelProvider { OpenRouter = 'openrouter', Perplexity = 'perplexity', Qwen = 'qwen', + SambaNova = 'sambanova', SenseNova = 'sensenova', SiliconCloud = 'siliconcloud', Spark = 'spark', diff --git a/src/types/user/settings/keyVaults.ts b/src/types/user/settings/keyVaults.ts index 6724795cf3286..fa56ca23f0a77 100644 --- a/src/types/user/settings/keyVaults.ts +++ b/src/types/user/settings/keyVaults.ts @@ -59,6 +59,7 @@ export interface UserKeyVaults { password?: string; perplexity?: OpenAICompatibleKeyVault; qwen?: OpenAICompatibleKeyVault; + sambanova?: OpenAICompatibleKeyVault; sensenova?: OpenAICompatibleKeyVault; siliconcloud?: OpenAICompatibleKeyVault; spark?: OpenAICompatibleKeyVault;