diff --git a/ai-assistant/package-lock.json b/ai-assistant/package-lock.json index 5a4c8d10f0..492bbe00f4 100644 --- a/ai-assistant/package-lock.json +++ b/ai-assistant/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@langchain/anthropic": "^1.1.1", "@langchain/core": "^1.0.6", + "@langchain/deepseek": "^1.0.8", "@langchain/google-genai": "^1.0.3", "@langchain/mistralai": "^1.0.0", "@langchain/ollama": "^1.0.1", @@ -2008,6 +2009,21 @@ "node": ">=20" } }, + "node_modules/@langchain/deepseek": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@langchain/deepseek/-/deepseek-1.0.8.tgz", + "integrity": "sha512-FE+j62PAKxsBRLrJafwzE8Ebi7UHXFrMgRGEn1Jnbb0oxp0DNYWPj73qWOMsHZGBCZnOSynCb6nWJ97U8bg8lg==", + "license": "MIT", + "dependencies": { + "@langchain/openai": "1.2.4" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "^1.0.0" + } + }, "node_modules/@langchain/google-genai": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@langchain/google-genai/-/google-genai-1.0.3.tgz", @@ -2149,13 +2165,13 @@ } }, "node_modules/@langchain/openai": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-1.1.2.tgz", - "integrity": "sha512-o642toyaRfx7Cej10jK6eK561gkIGTCQrN42fqAU9OhmTBkUflmRNKhqbcHj/RU+NOJfFM//hgwNU2gHespEkw==", + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@langchain/openai/-/openai-1.2.4.tgz", + "integrity": "sha512-3ThBOIXAJ6eXuqGGO41XDgr4rp/qpl/RpZmGcjv1S3+CRLS4UQBgXkZEab7mun85HfdsUWLs/v1+pDwbMFixcA==", "license": "MIT", "dependencies": { "js-tiktoken": "^1.0.12", - "openai": "^6.9.0", + "openai": "^6.16.0", "zod": "^3.25.76 || ^4" }, "engines": { @@ -13758,9 +13774,9 @@ } }, "node_modules/openai": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/openai/-/openai-6.9.1.tgz", - "integrity": "sha512-vQ5Rlt0ZgB3/BNmTa7bIijYFhz3YBceAA3Z4JuoMSBftBF9YqFHIEhZakSs+O/Ad7EaoEimZvHxD5ylRjN11Lg==", + "version": "6.17.0", + "resolved": "https://registry.npmmirror.com/openai/-/openai-6.17.0.tgz", + "integrity": "sha512-NHRpPEUPzAvFOAFs9+9pC6+HCw/iWsYsKCMPXH5Kw7BpMxqd8g/A07/1o7Gx2TWtCnzevVRyKMRFqyiHyAlqcA==", "license": "Apache-2.0", "bin": { "openai": "bin/cli" diff --git a/ai-assistant/package.json b/ai-assistant/package.json index 589df3e8b9..bea27a2de7 100644 --- a/ai-assistant/package.json +++ b/ai-assistant/package.json @@ -42,6 +42,7 @@ "@langchain/mistralai": "^1.0.0", "@langchain/ollama": "^1.0.1", "@langchain/openai": "^1.1.2", + "@langchain/deepseek": "^1.0.8", "@monaco-editor/react": "^4.5.2", "@types/prismjs": "^1.26.5", "@types/react-syntax-highlighter": "^15.5.13", diff --git a/ai-assistant/src/config/modelConfig.ts b/ai-assistant/src/config/modelConfig.ts index 4bb755873c..4dd983bfc6 100644 --- a/ai-assistant/src/config/modelConfig.ts +++ b/ai-assistant/src/config/modelConfig.ts @@ -182,6 +182,29 @@ export const modelProviders: ModelProvider[] = [ }, ], }, + { + id: 'deepseek', + name: 'DeepSeek', + icon: 'ai-providers:deepseek', + description: 'Integration with DeepSeek models', + fields: [ + { + name: 'apiKey', + label: 'API Key', + type: 'text', + required: true, + placeholder: 'Your DeepSeek API key', + }, + { + name: 'model', + label: 'Model', + type: 'select', + required: true, + options: ['deepseek-chat', 'deepseek-reasoner'], + default: 'deepseek-chat', + }, + ], + }, { id: 'local', name: 'Local Models', diff --git a/ai-assistant/src/langchain/LangChainManager.ts b/ai-assistant/src/langchain/LangChainManager.ts index 101ebd9eac..558be79ad9 100644 --- a/ai-assistant/src/langchain/LangChainManager.ts +++ b/ai-assistant/src/langchain/LangChainManager.ts @@ -15,6 +15,7 @@ import { ChatGoogleGenerativeAI } from '@langchain/google-genai'; import { ChatMistralAI } from '@langchain/mistralai'; import { ChatOllama } from '@langchain/ollama'; import { AzureChatOpenAI, ChatOpenAI } from '@langchain/openai'; +import { ChatDeepSeek } from '@langchain/deepseek'; import sanitizeHtml from 'sanitize-html'; import AIManager, { Prompt } from '../ai/manager'; import { basePrompt } from '../ai/prompts'; @@ -170,6 +171,16 @@ export default class LangChainManager extends AIManager { verbose: true, }); } + case 'deepseek': { + if (!sanitizedConfig.apiKey) { + throw new Error('API key is required for DeepSeek'); + } + return new ChatDeepSeek({ + apiKey: sanitizedConfig.apiKey, + model: sanitizedConfig.model, + verbose: true, + }); + } case 'local': { if (!sanitizedConfig.baseUrl) { throw new Error('Base URL is required for local models'); diff --git a/ai-assistant/src/utils/icons.ts b/ai-assistant/src/utils/icons.ts index b5013582a1..821c04f20e 100644 --- a/ai-assistant/src/utils/icons.ts +++ b/ai-assistant/src/utils/icons.ts @@ -23,6 +23,9 @@ const aiProviderIcons = { google: { body: '', }, + deepseek: { + body: '', + }, azure: { body: '', },