Skip to content

Commit ab796a7

Browse files
authored
✨ feat: add Nvidia NIM provider support (#6142)
* ✨ feat: add Nvidia NIM provider support * 🐛 fix: fix build error * 🔨 chore: sort code * 💄 style: update model list * 🐛 fix: fix ci error
1 parent bf6699c commit ab796a7

File tree

12 files changed

+248
-0
lines changed

12 files changed

+248
-0
lines changed

Dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,8 @@ ENV \
191191
MOONSHOT_API_KEY="" MOONSHOT_MODEL_LIST="" MOONSHOT_PROXY_URL="" \
192192
# Novita
193193
NOVITA_API_KEY="" NOVITA_MODEL_LIST="" \
194+
# Nvidia NIM
195+
NVIDIA_API_KEY="" NVIDIA_MODEL_LIST="" NVIDIA_PROXY_URL="" \
194196
# Ollama
195197
ENABLED_OLLAMA="" OLLAMA_MODEL_LIST="" OLLAMA_PROXY_URL="" \
196198
# OpenAI

Dockerfile.database

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,8 @@ ENV \
228228
MOONSHOT_API_KEY="" MOONSHOT_MODEL_LIST="" MOONSHOT_PROXY_URL="" \
229229
# Novita
230230
NOVITA_API_KEY="" NOVITA_MODEL_LIST="" \
231+
# Nvidia NIM
232+
NVIDIA_API_KEY="" NVIDIA_MODEL_LIST="" NVIDIA_PROXY_URL="" \
231233
# Ollama
232234
ENABLED_OLLAMA="" OLLAMA_MODEL_LIST="" OLLAMA_PROXY_URL="" \
233235
# OpenAI

src/app/[variants]/(main)/settings/llm/ProviderList/providers.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
MistralProviderCard,
1818
MoonshotProviderCard,
1919
NovitaProviderCard,
20+
NvidiaProviderCard,
2021
OpenRouterProviderCard,
2122
PerplexityProviderCard,
2223
QwenProviderCard,
@@ -68,6 +69,7 @@ export const useProviderList = (): ProviderItem[] => {
6869
TogetherAIProviderCard,
6970
FireworksAIProviderCard,
7071
GroqProviderCard,
72+
NvidiaProviderCard,
7173
PerplexityProviderCard,
7274
MistralProviderCard,
7375
Ai21ProviderCard,

src/config/aiModels/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { default as minimax } from './minimax';
2323
import { default as mistral } from './mistral';
2424
import { default as moonshot } from './moonshot';
2525
import { default as novita } from './novita';
26+
import { default as nvidia } from './nvidia';
2627
import { default as ollama } from './ollama';
2728
import { default as openai } from './openai';
2829
import { default as openrouter } from './openrouter';
@@ -84,6 +85,7 @@ export const LOBE_DEFAULT_MODEL_LIST = buildDefaultModelList({
8485
mistral,
8586
moonshot,
8687
novita,
88+
nvidia,
8789
ollama,
8890
openai,
8991
openrouter,
@@ -126,6 +128,7 @@ export { default as minimax } from './minimax';
126128
export { default as mistral } from './mistral';
127129
export { default as moonshot } from './moonshot';
128130
export { default as novita } from './novita';
131+
export { default as nvidia } from './nvidia';
129132
export { default as ollama } from './ollama';
130133
export { default as openai } from './openai';
131134
export { default as openrouter } from './openrouter';

src/config/aiModels/nvidia.ts

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
import { AIChatModelCard } from '@/types/aiModel';
2+
3+
const nvidiaChatModels: AIChatModelCard[] = [
4+
{
5+
abilities: {
6+
functionCall: true,
7+
},
8+
contextWindowTokens: 128_000,
9+
description: '先进的 LLM,擅长推理、数学、常识和函数调用。',
10+
displayName: 'Llama 3.3 70B Instruct',
11+
enabled: true,
12+
id: 'meta/llama-3.3-70b-instruct',
13+
type: 'chat'
14+
},
15+
{
16+
contextWindowTokens: 128_000,
17+
description: '先进的最尖端小型语言模型,具备语言理解、卓越的推理能力和文本生成能力。',
18+
displayName: 'Llama 3.2 1B Instruct',
19+
id: 'meta/llama-3.2-1b-instruct',
20+
type: 'chat'
21+
},
22+
{
23+
contextWindowTokens: 128_000,
24+
description: '先进的最尖端小型语言模型,具备语言理解、卓越的推理能力和文本生成能力。',
25+
displayName: 'Llama 3.2 3B Instruct',
26+
id: 'meta/llama-3.2-3b-instruct',
27+
type: 'chat'
28+
},
29+
{
30+
abilities: {
31+
vision: true,
32+
},
33+
contextWindowTokens: 128_000,
34+
description: '尖端的视觉-语言模型,擅长从图像中进行高质量推理。',
35+
displayName: 'Llama 3.2 11B Vision Instruct',
36+
enabled: true,
37+
id: 'meta/llama-3.2-11b-vision-instruct',
38+
type: 'chat'
39+
},
40+
{
41+
abilities: {
42+
vision: true,
43+
},
44+
contextWindowTokens: 128_000,
45+
description: '尖端的视觉-语言模型,擅长从图像中进行高质量推理。',
46+
displayName: 'Llama 3.2 90B Vision Instruct',
47+
id: 'meta/llama-3.2-90b-vision-instruct',
48+
type: 'chat'
49+
},
50+
{
51+
abilities: {
52+
functionCall: true,
53+
},
54+
contextWindowTokens: 128_000,
55+
description: '先进的最尖端模型,具备语言理解、卓越的推理能力和文本生成能力。',
56+
displayName: 'Llama 3.1 8B Instruct',
57+
id: 'meta/llama-3.1-8b-instruct',
58+
type: 'chat'
59+
},
60+
{
61+
abilities: {
62+
functionCall: true,
63+
},
64+
contextWindowTokens: 128_000,
65+
description: '赋能复杂对话,具备卓越的上下文理解、推理能力和文本生成能力。',
66+
displayName: 'Llama 3.1 70B Instruct',
67+
id: 'meta/llama-3.1-70b-instruct',
68+
type: 'chat'
69+
},
70+
{
71+
abilities: {
72+
functionCall: true,
73+
},
74+
contextWindowTokens: 128_000,
75+
description: '高级 LLM,支持合成数据生成、知识蒸馏和推理,适用于聊天机器人、编程和特定领域任务。',
76+
displayName: 'Llama 3.1 405B Instruct',
77+
id: 'meta/llama-3.1-405b-instruct',
78+
type: 'chat'
79+
},
80+
{
81+
contextWindowTokens: 32_768,
82+
description: '独特的语言模型,提供无与伦比的准确性和效率表现。',
83+
displayName: 'Llama 3.1 Nemotron 51B Instruct',
84+
id: 'nvidia/llama-3.1-nemotron-51b-instruct',
85+
type: 'chat'
86+
},
87+
{
88+
contextWindowTokens: 32_768,
89+
description: 'Llama-3.1-Nemotron-70B-Instruct 是 NVIDIA 定制的大型语言模型,旨在提高 LLM 生成的响应的帮助性。',
90+
displayName: 'Llama 3.1 Nemotron 70B Instruct',
91+
id: 'nvidia/llama-3.1-nemotron-70b-instruct',
92+
type: 'chat'
93+
},
94+
{
95+
contextWindowTokens: 8192,
96+
description: '面向边缘应用的高级小型语言生成 AI 模型。',
97+
displayName: 'Gemma 2 2B Instruct',
98+
id: 'google/gemma-2-2b-it',
99+
type: 'chat'
100+
},
101+
{
102+
contextWindowTokens: 8192,
103+
description: '尖端文本生成模型,擅长文本理解、转换和代码生成。',
104+
displayName: 'Gemma 2 9B Instruct',
105+
id: 'google/gemma-2-9b-it',
106+
type: 'chat'
107+
},
108+
{
109+
contextWindowTokens: 8192,
110+
description: '尖端文本生成模型,擅长文本理解、转换和代码生成。',
111+
displayName: 'Gemma 2 27B Instruct',
112+
id: 'google/gemma-2-27b-it',
113+
type: 'chat'
114+
},
115+
{
116+
abilities: {
117+
reasoning: true,
118+
},
119+
contextWindowTokens: 128_000,
120+
description: '最先进的高效 LLM,擅长推理、数学和编程。',
121+
displayName: 'DeepSeek R1',
122+
enabled: true,
123+
id: 'deepseek-ai/deepseek-r1',
124+
type: 'chat'
125+
},
126+
{
127+
abilities: {
128+
functionCall: true,
129+
},
130+
contextWindowTokens: 32_768,
131+
description: '面向中文和英文的 LLM,针对语言、编程、数学、推理等领域。',
132+
displayName: 'Qwen2.5 7B Instruct',
133+
enabled: true,
134+
id: 'qwen/qwen2.5-7b-instruct',
135+
type: 'chat'
136+
},
137+
{
138+
contextWindowTokens: 32_768,
139+
description: '强大的中型代码模型,支持 32K 上下文长度,擅长多语言编程。',
140+
displayName: 'Qwen2.5 Coder 7B Instruct',
141+
id: 'qwen/qwen2.5-coder-7b-instruct',
142+
type: 'chat'
143+
},
144+
{
145+
contextWindowTokens: 32_768,
146+
description: '高级 LLM,支持代码生成、推理和修复,涵盖主流编程语言。',
147+
displayName: 'Qwen2.5 Coder 32B Instruct',
148+
id: 'qwen/qwen2.5-coder-32b-instruct',
149+
type: 'chat'
150+
},
151+
]
152+
153+
export const allModels = [...nvidiaChatModels];
154+
155+
export default allModels;

src/config/llm.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ export const getLLMConfig = () => {
7777
ENABLED_NOVITA: z.boolean(),
7878
NOVITA_API_KEY: z.string().optional(),
7979

80+
ENABLED_NVIDIA: z.boolean(),
81+
NVIDIA_API_KEY: z.string().optional(),
82+
8083
ENABLED_BAICHUAN: z.boolean(),
8184
BAICHUAN_API_KEY: z.string().optional(),
8285

@@ -202,6 +205,9 @@ export const getLLMConfig = () => {
202205
ENABLED_NOVITA: !!process.env.NOVITA_API_KEY,
203206
NOVITA_API_KEY: process.env.NOVITA_API_KEY,
204207

208+
ENABLED_NVIDIA: !!process.env.NVIDIA_API_KEY,
209+
NVIDIA_API_KEY: process.env.NVIDIA_API_KEY,
210+
205211
ENABLED_BAICHUAN: !!process.env.BAICHUAN_API_KEY,
206212
BAICHUAN_API_KEY: process.env.BAICHUAN_API_KEY,
207213

src/config/modelProviders/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import MinimaxProvider from './minimax';
2323
import MistralProvider from './mistral';
2424
import MoonshotProvider from './moonshot';
2525
import NovitaProvider from './novita';
26+
import NvidiaProvider from './nvidia';
2627
import OllamaProvider from './ollama';
2728
import OpenAIProvider from './openai';
2829
import OpenRouterProvider from './openrouter';
@@ -67,6 +68,7 @@ export const LOBE_DEFAULT_MODEL_LIST: ChatModelCard[] = [
6768
ZeroOneProvider.chatModels,
6869
StepfunProvider.chatModels,
6970
NovitaProvider.chatModels,
71+
NvidiaProvider.chatModels,
7072
BaichuanProvider.chatModels,
7173
TaichuProvider.chatModels,
7274
CloudflareProvider.chatModels,
@@ -96,6 +98,7 @@ export const DEFAULT_MODEL_PROVIDER_LIST = [
9698
CloudflareProvider,
9799
GithubProvider,
98100
NovitaProvider,
101+
NvidiaProvider,
99102
TogetherAIProvider,
100103
FireworksAIProvider,
101104
GroqProvider,
@@ -158,6 +161,7 @@ export { default as MinimaxProviderCard } from './minimax';
158161
export { default as MistralProviderCard } from './mistral';
159162
export { default as MoonshotProviderCard } from './moonshot';
160163
export { default as NovitaProviderCard } from './novita';
164+
export { default as NvidiaProviderCard } from './nvidia';
161165
export { default as OllamaProviderCard } from './ollama';
162166
export { default as OpenAIProviderCard } from './openai';
163167
export { default as OpenRouterProviderCard } from './openrouter';

src/config/modelProviders/nvidia.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { ModelProviderCard } from '@/types/llm';
2+
3+
const Nvidia: ModelProviderCard = {
4+
chatModels: [],
5+
checkModel: 'meta/llama-3.2-1b-instruct',
6+
description: 'NVIDIA NIM™ 提供容器,可用于自托管 GPU 加速推理微服务,支持在云端、数据中心、RTX™ AI 个人电脑和工作站上部署预训练和自定义 AI 模型。',
7+
id: 'nvidia',
8+
modelList: { showModelFetcher: true },
9+
modelsUrl: 'https://build.nvidia.com/models',
10+
name: 'Nvidia',
11+
settings: {
12+
proxyUrl: {
13+
placeholder: 'https://integrate.api.nvidia.com/v1',
14+
},
15+
sdkType: 'openai',
16+
showModelFetcher: true,
17+
},
18+
url: 'https://build.nvidia.com',
19+
};
20+
21+
export default Nvidia;

src/libs/agent-runtime/AgentRuntime.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { LobeMinimaxAI } from './minimax';
2626
import { LobeMistralAI } from './mistral';
2727
import { LobeMoonshotAI } from './moonshot';
2828
import { LobeNovitaAI } from './novita';
29+
import { LobeNvidiaAI } from './nvidia';
2930
import { LobeOllamaAI } from './ollama';
3031
import { LobeOpenAI } from './openai';
3132
import { LobeOpenRouterAI } from './openrouter';
@@ -157,6 +158,7 @@ class AgentRuntime {
157158
mistral: Partial<ClientOptions>;
158159
moonshot: Partial<ClientOptions>;
159160
novita: Partial<ClientOptions>;
161+
nvidia: Partial<ClientOptions>;
160162
ollama: Partial<ClientOptions>;
161163
openai: Partial<ClientOptions>;
162164
openrouter: Partial<ClientOptions>;
@@ -300,6 +302,11 @@ class AgentRuntime {
300302
break;
301303
}
302304

305+
case ModelProvider.Nvidia: {
306+
runtimeModel = new LobeNvidiaAI(params.nvidia);
307+
break;
308+
}
309+
303310
case ModelProvider.Baichuan: {
304311
runtimeModel = new LobeBaichuanAI(params.baichuan ?? {});
305312
break;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import { ModelProvider } from '../types';
2+
import { LobeOpenAICompatibleFactory } from '../utils/openaiCompatibleFactory';
3+
4+
import type { ChatModelCard } from '@/types/llm';
5+
6+
export interface NvidiaModelCard {
7+
id: string;
8+
}
9+
10+
export const LobeNvidiaAI = LobeOpenAICompatibleFactory({
11+
baseURL: 'https://integrate.api.nvidia.com/v1',
12+
debug: {
13+
chatCompletion: () => process.env.DEBUG_NVIDIA_CHAT_COMPLETION === '1',
14+
},
15+
models: async ({ client }) => {
16+
const { LOBE_DEFAULT_MODEL_LIST } = await import('@/config/aiModels');
17+
18+
const modelsPage = await client.models.list() as any;
19+
const modelList: NvidiaModelCard[] = modelsPage.data;
20+
21+
return modelList
22+
.map((model) => {
23+
const knownModel = LOBE_DEFAULT_MODEL_LIST.find((m) => model.id.toLowerCase() === m.id.toLowerCase());
24+
25+
return {
26+
contextWindowTokens: knownModel?.contextWindowTokens ?? undefined,
27+
displayName: knownModel?.displayName ?? undefined,
28+
enabled: knownModel?.enabled || false,
29+
functionCall:
30+
knownModel?.abilities?.functionCall
31+
|| false,
32+
id: model.id,
33+
reasoning:
34+
knownModel?.abilities?.reasoning
35+
|| false,
36+
vision:
37+
knownModel?.abilities?.vision
38+
|| false,
39+
};
40+
})
41+
.filter(Boolean) as ChatModelCard[];
42+
},
43+
provider: ModelProvider.Nvidia,
44+
});

0 commit comments

Comments
 (0)