feat: 添加 DeepSeek AI

This commit is contained in:
kuaifan 2025-02-04 13:02:26 +09:00
parent 80313f613e
commit d973451bdc
6 changed files with 139 additions and 69 deletions

View File

@ -65,7 +65,7 @@ class Setting extends AbstractModel
$value['claude_key'] = $value['claude_token']; $value['claude_key'] = $value['claude_token'];
} }
$array = []; $array = [];
$aiList = ['openai', 'claude', 'gemini', 'zhipu', 'qianwen', 'wenxin']; $aiList = ['openai', 'claude', 'deepseek', 'gemini', 'zhipu', 'qianwen', 'wenxin'];
$fieldList = ['key', 'model', 'base_url', 'agency', 'system', 'secret']; $fieldList = ['key', 'model', 'base_url', 'agency', 'system', 'secret'];
foreach ($aiList as $aiName) { foreach ($aiList as $aiName) {
foreach ($fieldList as $fieldName) { foreach ($fieldList as $fieldName) {
@ -73,6 +73,7 @@ class Setting extends AbstractModel
$array[$key] = $value[$key] ?: match ($key) { $array[$key] = $value[$key] ?: match ($key) {
'openai_model' => 'gpt-4o-mini', 'openai_model' => 'gpt-4o-mini',
'claude_model' => 'claude-3-5-sonnet-latest', 'claude_model' => 'claude-3-5-sonnet-latest',
'deepseek_model' => 'deepseek-chat',
'gemini_model' => 'gemini-1.5-flash', 'gemini_model' => 'gemini-1.5-flash',
'zhipu_model' => 'glm-4', 'zhipu_model' => 'glm-4',
'qianwen_model' => 'qwen-turbo', 'qianwen_model' => 'qwen-turbo',

View File

@ -593,6 +593,8 @@ class User extends AbstractModel
return url("images/avatar/default_openai.png"); return url("images/avatar/default_openai.png");
case 'ai-claude@bot.system': case 'ai-claude@bot.system':
return url("images/avatar/default_claude.png"); return url("images/avatar/default_claude.png");
case 'ai-deepseek@bot.system':
return url("images/avatar/default_deepseek.png");
case 'ai-gemini@bot.system': case 'ai-gemini@bot.system':
return url("images/avatar/default_gemini.png"); return url("images/avatar/default_gemini.png");
case 'ai-zhipu@bot.system': case 'ai-zhipu@bot.system':

View File

@ -83,6 +83,7 @@ class UserBot extends AbstractModel
'approval-alert' => '审批', 'approval-alert' => '审批',
'ai-openai' => 'ChatGPT', 'ai-openai' => 'ChatGPT',
'ai-claude' => 'Claude', 'ai-claude' => 'Claude',
'ai-deepseek' => 'DeepSeek',
'ai-wenxin' => '文心一言', 'ai-wenxin' => '文心一言',
'ai-qianwen' => '通义千问', 'ai-qianwen' => '通义千问',
'ai-gemini' => 'Gemini', 'ai-gemini' => 'Gemini',

View File

@ -47,7 +47,7 @@
</DrawerOverlay> </DrawerOverlay>
<!--AI 机器人--> <!--AI 机器人-->
<DrawerOverlay v-model="aibotShow" placement="right" :size="720"> <DrawerOverlay v-model="aibotShow" placement="right" :size="800">
<div class="ivu-modal-wrap-apply"> <div class="ivu-modal-wrap-apply">
<div class="ivu-modal-wrap-apply-title"> <div class="ivu-modal-wrap-apply-title">
{{ $L('AI 机器人') }} {{ $L('AI 机器人') }}
@ -78,6 +78,11 @@
<SystemAibot type="Claude" v-if="aibotTabAction == 'claude'" /> <SystemAibot type="Claude" v-if="aibotTabAction == 'claude'" />
</div> </div>
</TabPane> </TabPane>
<TabPane label="DeepSeek" name="deepseek">
<div class="aibot-warp">
<SystemAibot type="DeepSeek" v-if="aibotTabAction == 'deepseek'" />
</div>
</TabPane>
<TabPane label="Gemini" name="gemini"> <TabPane label="Gemini" name="gemini">
<div class="aibot-warp"> <div class="aibot-warp">
<SystemAibot type="Gemini" v-if="aibotTabAction == 'gemini'" /> <SystemAibot type="Gemini" v-if="aibotTabAction == 'gemini'" />
@ -262,6 +267,12 @@ export default {
src: $A.mainUrl('images/avatar/default_claude.png'), src: $A.mainUrl('images/avatar/default_claude.png'),
desc: this.$L('我是Claude,一个由Anthropic公司创造出来的AI助手机器人。我的工作是帮助人类,与人对话并给出解答。') desc: this.$L('我是Claude,一个由Anthropic公司创造出来的AI助手机器人。我的工作是帮助人类,与人对话并给出解答。')
}, },
{
value: "deepseek",
label: "DeepSeek",
src: $A.mainUrl('images/avatar/default_deepseek.png'),
desc: this.$L('DeepSeek大语言模型算法是北京深度求索人工智能基础技术研究有限公司推出的深度合成服务算法。')
},
{ {
value: "gemini", value: "gemini",
label: "Gemini", label: "Gemini",

View File

@ -18,14 +18,16 @@
type="password" type="password"
:placeholder="$L(field.placeholder)"/> :placeholder="$L(field.placeholder)"/>
</template> </template>
<template v-else-if="field.type === 'select'"> <template v-else-if="field.type === 'auto-complete'">
<Select v-model="formData[field.prop]" transfer> <AutoComplete
<Option v-for="option in field.options" v-model="formData[field.prop]"
:key="option.value" :data="field.data"
:value="option.value"> :placeholder="$L(field.placeholder)"
{{ option.value }} :filter-method="field.noFilter ? null : filterMethod"
</Option> @on-blur="field.noFilter = true"
</Select> @on-keyup="field.noFilter = false"
transfer>
</AutoComplete>
</template> </template>
<template v-else-if="field.type === 'textarea'"> <template v-else-if="field.type === 'textarea'">
<Input <Input
@ -90,17 +92,19 @@ export default {
{ {
label: '模型', label: '模型',
prop: 'openai_model', prop: 'openai_model',
type: 'select', type: 'auto-complete',
options: [ data: [
{ value: 'gpt-4' }, 'gpt-4',
{ value: 'gpt-4-turbo' }, 'gpt-4-turbo',
{ value: 'gpt-4o' }, 'gpt-4o',
{ value: 'gpt-4o-mini' }, 'gpt-4o-mini',
{ value: 'gpt-3.5-turbo' }, 'gpt-3.5-turbo',
{ value: 'gpt-3.5-turbo-16k' }, 'gpt-3.5-turbo-16k',
{ value: 'gpt-3.5-turbo-0125' }, 'gpt-3.5-turbo-0125',
{ value: 'gpt-3.5-turbo-1106' } 'gpt-3.5-turbo-1106'
], ],
noFilter: true,
placeholder: '请输入模型名称',
tipPrefix: '查看说明', tipPrefix: '查看说明',
link: 'https://platform.openai.com/docs/models' link: 'https://platform.openai.com/docs/models'
}, },
@ -138,18 +142,20 @@ export default {
{ {
label: '模型', label: '模型',
prop: 'claude_model', prop: 'claude_model',
type: 'select', type: 'auto-complete',
options: [ data: [
{ value: 'claude-3-5-sonnet-latest' }, 'claude-3-5-sonnet-latest',
{ value: 'claude-3-5-sonnet-20241022' }, 'claude-3-5-sonnet-20241022',
{ value: 'claude-3-5-haiku-latest' }, 'claude-3-5-haiku-latest',
{ value: 'claude-3-5-haiku-20241022' }, 'claude-3-5-haiku-20241022',
{ value: 'claude-3-opus-latest' }, 'claude-3-opus-latest',
{ value: 'claude-3-opus-20240229' }, 'claude-3-opus-20240229',
{ value: 'claude-3-haiku-20240307' }, 'claude-3-haiku-20240307',
{ value: 'claude-2.1' }, 'claude-2.1',
{ value: 'claude-2.0' } 'claude-2.0'
], ],
noFilter: true,
placeholder: '请输入模型名称',
tipPrefix: '查看说明', tipPrefix: '查看说明',
link: 'https://docs.anthropic.com/en/docs/about-claude/models' link: 'https://docs.anthropic.com/en/docs/about-claude/models'
}, },
@ -168,6 +174,44 @@ export default {
} }
] ]
}, },
DeepSeek: {
fields: [
{
label: 'API Key',
prop: 'deepseek_key',
type: 'password',
placeholder: 'DeepSeek API Key',
tipPrefix: '访问DeepSeek网站查看',
link: 'https://platform.deepseek.com/api_keys'
},
{
label: '模型',
prop: 'deepseek_model',
type: 'auto-complete',
data: [
'deepseek-chat',
'deepseek-reasoner'
],
noFilter: true,
placeholder: '请输入模型名称',
tipPrefix: '查看说明',
link: 'https://api-docs.deepseek.com/zh-cn/quick_start/pricing'
},
{
label: '使用代理',
prop: 'deepseek_agency',
placeholder: '支持 http 或 socks 代理',
tip: '例如http://proxy.com 或 socks5://proxy.com'
},
{
label: '默认提示词',
prop: 'deepseek_system',
type: 'textarea',
placeholder: '请输入默认提示词',
tip: '例如你是一个人开发的AI助手'
}
]
},
Gemini: { Gemini: {
fields: [ fields: [
{ {
@ -180,13 +224,15 @@ export default {
{ {
label: '模型', label: '模型',
prop: 'gemini_model', prop: 'gemini_model',
type: 'select', type: 'auto-complete',
options: [ data: [
{ value: 'gemini-1.5-flash' }, 'gemini-1.5-flash',
{ value: 'gemini-1.5-flash-8b' }, 'gemini-1.5-flash-8b',
{ value: 'gemini-1.5-pro' }, 'gemini-1.5-pro',
{ value: 'gemini-1.0-pro' }, 'gemini-1.0-pro',
], ],
noFilter: true,
placeholder: '请输入模型名称',
tipPrefix: '查看说明', tipPrefix: '查看说明',
link: 'https://ai.google.dev/models/gemini' link: 'https://ai.google.dev/models/gemini'
}, },
@ -217,18 +263,20 @@ export default {
{ {
label: '模型', label: '模型',
prop: 'zhipu_model', prop: 'zhipu_model',
type: 'select', type: 'auto-complete',
options: [ data: [
{ value: 'glm-4' }, 'glm-4',
{ value: 'glm-4-plus' }, 'glm-4-plus',
{ value: 'glm-4-air' }, 'glm-4-air',
{ value: 'glm-4-airx' }, 'glm-4-airx',
{ value: 'glm-4-long' }, 'glm-4-long',
{ value: 'glm-4-flash' }, 'glm-4-flash',
{ value: 'glm-4v' }, 'glm-4v',
{ value: 'glm-4v-plus' }, 'glm-4v-plus',
{ value: 'glm-3-turbo' } 'glm-3-turbo'
], ],
noFilter: true,
placeholder: '请输入模型名称',
tipPrefix: '查看说明', tipPrefix: '查看说明',
link: 'https://open.bigmodel.cn/dev/api' link: 'https://open.bigmodel.cn/dev/api'
}, },
@ -259,16 +307,18 @@ export default {
{ {
label: '模型', label: '模型',
prop: 'qianwen_model', prop: 'qianwen_model',
type: 'select', type: 'auto-complete',
options: [ data: [
{ value: 'qwen-turbo' }, 'qwen-turbo',
{ value: 'qwen-turbo-latest' }, 'qwen-turbo-latest',
{ value: 'qwen-plus' }, 'qwen-plus',
{ value: 'qwen-plus-latest' }, 'qwen-plus-latest',
{ value: 'qwen-max' }, 'qwen-max',
{ value: 'qwen-max-latest' }, 'qwen-max-latest',
{ value: 'qwen-long' }, 'qwen-long',
], ],
noFilter: true,
placeholder: '请输入模型名称',
tipPrefix: '查看说明', tipPrefix: '查看说明',
link: 'https://help.aliyun.com/zh/model-studio/getting-started/models' link: 'https://help.aliyun.com/zh/model-studio/getting-started/models'
}, },
@ -306,19 +356,21 @@ export default {
{ {
label: '模型', label: '模型',
prop: 'wenxin_model', prop: 'wenxin_model',
type: 'select', type: 'auto-complete',
options: [ data: [
{ value: 'ernie-4.0-8k' }, 'ernie-4.0-8k',
{ value: 'ernie-4.0-8k-latest' }, 'ernie-4.0-8k-latest',
{ value: 'ernie-4.0-turbo-128k' }, 'ernie-4.0-turbo-128k',
{ value: 'ernie-4.0-turbo-8k' }, 'ernie-4.0-turbo-8k',
{ value: 'ernie-3.5-128k' }, 'ernie-3.5-128k',
{ value: 'ernie-3.5-8k' }, 'ernie-3.5-8k',
{ value: 'ernie-speed-128k' }, 'ernie-speed-128k',
{ value: 'ernie-speed-8k' }, 'ernie-speed-8k',
{ value: 'ernie-lite-8k' }, 'ernie-lite-8k',
{ value: 'ernie-tiny-8k' }, 'ernie-tiny-8k',
], ],
noFilter: true,
placeholder: '请输入模型名称',
tipPrefix: '查看说明', tipPrefix: '查看说明',
link: 'https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Blfmc9dlf' link: 'https://cloud.baidu.com/doc/WENXINWORKSHOP/s/Blfmc9dlf'
}, },
@ -347,6 +399,9 @@ export default {
...mapState(['formOptions']), ...mapState(['formOptions']),
}, },
methods: { methods: {
filterMethod(value, option) {
return option.toUpperCase().indexOf(value.toUpperCase()) !== -1;
},
submitForm() { submitForm() {
this.$refs.formData.validate((valid) => { this.$refs.formData.validate((valid) => {
if (valid) { if (valid) {

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB