From 5a7f4efa913c74ee09aa3cd9e4de3326c0a52166 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Fri, 21 Feb 2025 12:08:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=20Grok=20AI=E3=80=81?= =?UTF-8?q?Ollama=20AI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Models/Setting.php | 54 +++++++++++-------- app/Models/User.php | 4 ++ app/Models/UserBot.php | 6 ++- .../assets/js/pages/manage/application.vue | 46 +++++++++++----- .../manage/setting/components/SystemAibot.vue | 27 ++++++++++ 5 files changed, 101 insertions(+), 36 deletions(-) diff --git a/app/Models/Setting.php b/app/Models/Setting.php index 0da909f4b..9a131715c 100644 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -65,7 +65,7 @@ class Setting extends AbstractModel $value['claude_key'] = $value['claude_token']; } $array = []; - $aiList = ['openai', 'claude', 'deepseek', 'gemini', 'zhipu', 'qianwen', 'wenxin']; + $aiList = ['openai', 'claude', 'deepseek', 'gemini', 'grok', 'ollama', 'zhipu', 'qianwen', 'wenxin']; $fieldList = ['key', 'models', 'model', 'base_url', 'agency', 'temperature', 'system', 'secret']; foreach ($aiList as $aiName) { foreach ($fieldList as $fieldName) { @@ -148,27 +148,6 @@ class Setting extends AbstractModel 'deepseek-chat: DeepSeek V3', 'deepseek-reasoner: DeepSeek R1' ], - 'wenxin' => [ - 'ernie-4.0-8k: Ernie 4.0 8K', - 'ernie-4.0-8k-latest: Ernie 4.0 8K Latest', - 'ernie-4.0-turbo-128k: Ernie 4.0 Turbo 128K', - 'ernie-4.0-turbo-8k: Ernie 4.0 Turbo 8K', - 'ernie-3.5-128k: Ernie 3.5 128K', - 'ernie-3.5-8k: Ernie 3.5 8K', - 'ernie-speed-128k: Ernie Speed 128K', - 'ernie-speed-8k: Ernie Speed 8K', - 'ernie-lite-8k: Ernie Lite 8K', - 'ernie-tiny-8k: Ernie Tiny 8K' - ], - 'qianwen' => [ - 'qwen-max: QWEN Max', - 'qwen-max-latest: QWEN Max Latest', - 'qwen-turbo: QWEN Turbo', - 'qwen-turbo-latest: QWEN Turbo Latest', - 'qwen-plus: QWEN Plus', - 'qwen-plus-latest: QWEN Plus Latest', - 'qwen-long: QWEN Long' - ], 'gemini' => [ 'gemini-2.0-flash: Gemini 2.0 Flash', 'gemini-2.0-flash-lite-preview-02-05: Gemini 2.0 Flash-Lite Preview', @@ -177,6 +156,16 @@ class Setting extends AbstractModel 'gemini-1.5-pro: Gemini 1.5 Pro', 'gemini-1.0-pro: Gemini 1.0 Pro' ], + 'grok' => [ + 'grok-2-vision-1212: Grok 2 Vision 1212', + 'grok-2-vision: Grok 2 Vision', + 'grok-2-vision-latest: Grok 2 Vision Latest', + 'grok-2-1212: Grok 2 1212', + 'grok-2: Grok 2', + 'grok-2-latest: Grok 2 Latest', + 'grok-vision-beta: Grok Vision Beta', + 'grok-beta: Grok Beta', + ], 'zhipu' => [ 'glm-4: GLM-4', 'glm-4-plus: GLM-4 Plus', @@ -188,6 +177,27 @@ class Setting extends AbstractModel 'glm-4v-plus: GLM-4V Plus', 'glm-3-turbo: GLM-3 Turbo' ], + 'qianwen' => [ + 'qwen-max: QWEN Max', + 'qwen-max-latest: QWEN Max Latest', + 'qwen-turbo: QWEN Turbo', + 'qwen-turbo-latest: QWEN Turbo Latest', + 'qwen-plus: QWEN Plus', + 'qwen-plus-latest: QWEN Plus Latest', + 'qwen-long: QWEN Long' + ], + 'wenxin' => [ + 'ernie-4.0-8k: Ernie 4.0 8K', + 'ernie-4.0-8k-latest: Ernie 4.0 8K Latest', + 'ernie-4.0-turbo-128k: Ernie 4.0 Turbo 128K', + 'ernie-4.0-turbo-8k: Ernie 4.0 Turbo 8K', + 'ernie-3.5-128k: Ernie 3.5 128K', + 'ernie-3.5-8k: Ernie 3.5 8K', + 'ernie-speed-128k: Ernie Speed 128K', + 'ernie-speed-8k: Ernie Speed 8K', + 'ernie-lite-8k: Ernie Lite 8K', + 'ernie-tiny-8k: Ernie Tiny 8K' + ], default => [], }; } diff --git a/app/Models/User.php b/app/Models/User.php index 597a659ec..62c6f295d 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -597,6 +597,10 @@ class User extends AbstractModel return url("images/avatar/default_deepseek.png"); case 'ai-gemini@bot.system': return url("images/avatar/default_gemini.png"); + case 'ai-grok@bot.system': + return url("images/avatar/default_grok.png"); + case 'ai-ollama@bot.system': + return url("images/avatar/default_ollama.png"); case 'ai-zhipu@bot.system': return url("images/avatar/default_zhipu.png"); case 'bot-manager@bot.system': diff --git a/app/Models/UserBot.php b/app/Models/UserBot.php index 5bbf1abc1..2b6a00b31 100644 --- a/app/Models/UserBot.php +++ b/app/Models/UserBot.php @@ -84,10 +84,12 @@ class UserBot extends AbstractModel 'ai-openai' => 'ChatGPT', 'ai-claude' => 'Claude', 'ai-deepseek' => 'DeepSeek', - 'ai-wenxin' => '文心一言', - 'ai-qianwen' => '通义千问', 'ai-gemini' => 'Gemini', + 'ai-grok' => 'Grok', + 'ai-ollama' => 'Ollama', 'ai-zhipu' => '智谱清言', + 'ai-qianwen' => '通义千问', + 'ai-wenxin' => '文心一言', 'bot-manager' => '机器人管理', 'meeting-alert' => '会议通知', 'okr-alert' => 'OKR提醒', diff --git a/resources/assets/js/pages/manage/application.vue b/resources/assets/js/pages/manage/application.vue index 8f52dcbe1..7d77a4b23 100644 --- a/resources/assets/js/pages/manage/application.vue +++ b/resources/assets/js/pages/manage/application.vue @@ -47,7 +47,7 @@ - +
{{ $L('AI 机器人') }} @@ -88,21 +88,31 @@
+ +
+ +
+
+ +
+ +
+
- -
- -
-
+ +
+ +
+
@@ -279,24 +289,36 @@ export default { src: $A.mainUrl('images/avatar/default_gemini.png'), desc: `${this.$L('我是由Google开发的生成式人工智能聊天机器人。')}${this.$L('它基于同名的Gemini系列大型语言模型。')}${this.$L('是应对OpenAI公司开发的ChatGPT聊天机器人的崛起而开发的。')}` }, + { + value: "grok", + label: "Grok", + src: $A.mainUrl('images/avatar/default_grok.png'), + desc: this.$L('Grok是由xAI开发的生成式人工智能聊天机器人,旨在通过实时回答用户问题来提供帮助。') + }, + { + value: "ollama", + label: "Ollama", + src: $A.mainUrl('images/avatar/default_ollama.png'), + desc: this.$L('Ollama 是一个轻量级、可扩展的框架,旨在让用户能够在本地机器上构建和运行大型语言模型。') + }, { value: "zhipu", label: "Zhipu", src: $A.mainUrl('images/avatar/default_zhipu.png'), desc: `${this.$L('我是智谱清言,是智谱 AI 公司于2023训练的语言模型。')}${this.$L('我的任务是针对用户的问题和要求提供适当的答复和支持。')}` }, - { - value: "wenxin", - label: "Wenxin", - src: $A.mainUrl('avatar/%E6%96%87%E5%BF%83.png'), - desc: this.$L('我是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。') - }, { value: "qianwen", label: "Qianwen", src: $A.mainUrl('avatar/%E9%80%9A%E4%B9%89%E5%8D%83%E9%97%AE.png'), desc: this.$L('我是达摩院自主研发的超大规模语言模型,能够回答问题、创作文字,还能表达观点、撰写代码。') }, + { + value: "wenxin", + label: "Wenxin", + src: $A.mainUrl('avatar/%E6%96%87%E5%BF%83.png'), + desc: this.$L('我是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。') + }, ], aibotTabAction: "openai", aibotShow: false, diff --git a/resources/assets/js/pages/manage/setting/components/SystemAibot.vue b/resources/assets/js/pages/manage/setting/components/SystemAibot.vue index 341727cb9..81a20de34 100644 --- a/resources/assets/js/pages/manage/setting/components/SystemAibot.vue +++ b/resources/assets/js/pages/manage/setting/components/SystemAibot.vue @@ -175,6 +175,32 @@ export default { } ] }, + grok: { + extraFields: [ + { + prop: "key", + placeholder: "Grok API Key", + link: "https://docs.x.ai/docs/tutorial" + }, + { + prop: "models", + link: "https://docs.x.ai/docs/models" + } + ] + }, + ollama: { + extraFields: [ + { + prop: "key", + placeholder: "Ollama API Key", + }, + { + prop: "models", + link: "https://ollama.com/models", + functions: null, + } + ] + }, zhipu: { extraFields: [ { @@ -341,6 +367,7 @@ export default { spinner: 600, }).then(({data}) => { this.formData[prop] = data.models.join('\n'); + $A.messageSuccess('获取成功'); }).catch(({msg}) => { $A.modalError(msg || '获取失败'); });