From 976b30027744d9b6bdf2a922643fadf0e12ee6d4 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Fri, 21 Feb 2025 23:08:11 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96AI=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Models/Setting.php | 132 ++++----- ...25_02_21_225057_update_ai_models_table.php | 50 ++++ .../assets/js/pages/manage/application.vue | 95 +++---- .../manage/setting/components/SystemAibot.vue | 187 +------------ resources/assets/js/store/ai.js | 262 ++++++++++++++++++ resources/assets/sass/pages/page-apply.scss | 11 +- 6 files changed, 421 insertions(+), 316 deletions(-) create mode 100644 database/migrations/2025_02_21_225057_update_ai_models_table.php create mode 100644 resources/assets/js/store/ai.js diff --git a/app/Models/Setting.php b/app/Models/Setting.php index 9a131715c..2b4f3e2ca 100644 --- a/app/Models/Setting.php +++ b/app/Models/Setting.php @@ -121,82 +121,82 @@ class Setting extends AbstractModel { return match ($ai) { 'openai' => [ - 'gpt-4: GPT-4', - 'gpt-4-turbo: GPT-4 Turbo', - 'gpt-4o: GPT-4o', - 'gpt-4o-mini: GPT-4o Mini', - 'o1: GPT-o1', - 'o1-mini: GPT-o1 Mini', - 'o3-mini: GPT-o3 Mini', - 'gpt-3.5-turbo: GPT-3.5 Turbo', - 'gpt-3.5-turbo-16k: GPT-3.5 Turbo 16K', - 'gpt-3.5-turbo-0125: GPT-3.5 Turbo 0125', - 'gpt-3.5-turbo-1106: GPT-3.5 Turbo 1106' + 'gpt-4 | GPT-4', + 'gpt-4-turbo | GPT-4 Turbo', + 'gpt-4o | GPT-4o', + 'gpt-4o-mini | GPT-4o Mini', + 'o1 | GPT-o1', + 'o1-mini | GPT-o1 Mini', + 'o3-mini | GPT-o3 Mini', + 'gpt-3.5-turbo | GPT-3.5 Turbo', + 'gpt-3.5-turbo-16k | GPT-3.5 Turbo 16K', + 'gpt-3.5-turbo-0125 | GPT-3.5 Turbo 0125', + 'gpt-3.5-turbo-1106 | GPT-3.5 Turbo 1106' ], 'claude' => [ - 'claude-3-5-sonnet-latest: Claude 3.5 Sonnet', - 'claude-3-5-sonnet-20241022: Claude 3.5 Sonnet 20241022', - 'claude-3-5-haiku-latest: Claude 3.5 Haiku', - 'claude-3-5-haiku-20241022: Claude 3.5 Haiku 20241022', - 'claude-3-opus-latest: Claude 3 Opus', - 'claude-3-opus-20240229: Claude 3 Opus 20240229', - 'claude-3-haiku-20240307: Claude 3 Haiku 20240307', - 'claude-2.1: Claude 2.1', - 'claude-2.0: Claude 2.0' + 'claude-3-5-sonnet-latest | Claude 3.5 Sonnet', + 'claude-3-5-sonnet-20241022 | Claude 3.5 Sonnet 20241022', + 'claude-3-5-haiku-latest | Claude 3.5 Haiku', + 'claude-3-5-haiku-20241022 | Claude 3.5 Haiku 20241022', + 'claude-3-opus-latest | Claude 3 Opus', + 'claude-3-opus-20240229 | Claude 3 Opus 20240229', + 'claude-3-haiku-20240307 | Claude 3 Haiku 20240307', + 'claude-2.1 | Claude 2.1', + 'claude-2.0 | Claude 2.0' ], 'deepseek' => [ - 'deepseek-chat: DeepSeek V3', - 'deepseek-reasoner: DeepSeek R1' + 'deepseek-chat | DeepSeek V3', + 'deepseek-reasoner | DeepSeek R1' ], 'gemini' => [ - 'gemini-2.0-flash: Gemini 2.0 Flash', - 'gemini-2.0-flash-lite-preview-02-05: Gemini 2.0 Flash-Lite Preview', - 'gemini-1.5-flash: Gemini 1.5 Flash', - 'gemini-1.5-flash-8b: Gemini 1.5 Flash 8B', - 'gemini-1.5-pro: Gemini 1.5 Pro', - 'gemini-1.0-pro: Gemini 1.0 Pro' + 'gemini-2.0-flash | Gemini 2.0 Flash', + 'gemini-2.0-flash-lite-preview-02-05 | Gemini 2.0 Flash-Lite Preview', + 'gemini-1.5-flash | Gemini 1.5 Flash', + 'gemini-1.5-flash-8b | Gemini 1.5 Flash 8B', + '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', + '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', - 'glm-4-air: GLM-4 Air', - 'glm-4-airx: GLM-4 AirX', - 'glm-4-long: GLM-4 Long', - 'glm-4-flash: GLM-4 Flash', - 'glm-4v: GLM-4V', - 'glm-4v-plus: GLM-4V Plus', - 'glm-3-turbo: GLM-3 Turbo' + 'glm-4 | GLM-4', + 'glm-4-plus | GLM-4 Plus', + 'glm-4-air | GLM-4 Air', + 'glm-4-airx | GLM-4 AirX', + 'glm-4-long | GLM-4 Long', + 'glm-4-flash | GLM-4 Flash', + 'glm-4v | GLM-4V', + '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' + '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' + '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 => [], }; @@ -213,11 +213,11 @@ class Setting extends AbstractModel $list = is_array($models) ? $models : explode("\n", $models); $array = []; foreach ($list as $item) { - list($value, $label) = explode(':', $item . ':'); - if ($value) { + $arr = Base::newTrim(explode('|', $item . '|')); + if ($arr[0]) { $array[] = [ - 'value' => trim($value), - 'label' => trim($label ?: $value) + 'value' => $arr[0], + 'label' => $arr[1] ?: $arr[0] ]; } } diff --git a/database/migrations/2025_02_21_225057_update_ai_models_table.php b/database/migrations/2025_02_21_225057_update_ai_models_table.php new file mode 100644 index 000000000..d4ee12542 --- /dev/null +++ b/database/migrations/2025_02_21_225057_update_ai_models_table.php @@ -0,0 +1,50 @@ +first(); + if (empty($row)) { + return; + } + $value = Base::json2array($row->getRawOriginal('setting')); + foreach ($value as $key => $item) { + if (str_ends_with($key, '_models')) { + $value[$key] = preg_replace('/\s*:\s*/', ' | ', $item); + } + } + $row->setting = Base::array2json($value); + $row->save(); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + $row = Setting::whereName('aibotSetting')->first(); + if (empty($row)) { + return; + } + $value = Base::json2array($row->getRawOriginal('setting')); + foreach ($value as $key => $item) { + if (str_ends_with($key, '_models')) { + $value[$key] = preg_replace('/\s*\|\s*/', ': ', $item); + } + } + $row->setting = Base::array2json($value); + $row->save(); + } +} diff --git a/resources/assets/js/pages/manage/application.vue b/resources/assets/js/pages/manage/application.vue index 9684620c6..1b363358f 100644 --- a/resources/assets/js/pages/manage/application.vue +++ b/resources/assets/js/pages/manage/application.vue @@ -49,7 +49,10 @@
-
{{ $L('AI 列表') }}
+
+ {{ $L('AI 列表') }} +

{{$L('机器人设置')}}

+
  • @@ -59,14 +62,12 @@

    {{ item.label }}

    {{ item.desc }}

    -
      -
    • aa
    • -
    • 22
    • -
    • cc
    • +
        +
      • {{ tag }}
      - +
  • @@ -78,7 +79,10 @@
    -
    {{ $L('AI 设置') }}
    +
    + {{ $L('AI 设置') }} +

    {{$L('返回')}}

    +
    @@ -255,6 +259,7 @@ import SystemThirdAccess from "./setting/components/SystemThirdAccess"; import SystemEmailSetting from "./setting/components/SystemEmailSetting"; import SystemAppPush from "./setting/components/SystemAppPush"; import emitter from "../../store/events"; +import {AIBotList, AIModelNames} from "../../store/ai"; export default { components: { @@ -277,62 +282,7 @@ export default { workReportShow: false, workReportTabs: "my", // - aibotList: [ - { - value: "openai", - label: "ChatGPT", - src: $A.mainUrl('images/avatar/default_openai.png'), - desc: this.$L('我是一个人工智能助手,为用户提供问题解答和指导。我没有具体的身份,只是一个程序。您有什么问题可以问我哦?') - }, - { - value: "claude", - label: "Claude", - src: $A.mainUrl('images/avatar/default_claude.png'), - desc: this.$L('我是Claude,一个由Anthropic公司创造出来的AI助手机器人。我的工作是帮助人类,与人对话并给出解答。') - }, - { - value: "deepseek", - label: "DeepSeek", - src: $A.mainUrl('images/avatar/default_deepseek.png'), - desc: this.$L('DeepSeek大语言模型算法是北京深度求索人工智能基础技术研究有限公司推出的深度合成服务算法。') - }, - { - value: "gemini", - label: "Gemini", - 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: "qianwen", - label: "通义千问", - src: $A.mainUrl('avatar/%E9%80%9A%E4%B9%89%E5%8D%83%E9%97%AE.png'), - desc: this.$L('我是达摩院自主研发的超大规模语言模型,能够回答问题、创作文字,还能表达观点、撰写代码。') - }, - { - value: "wenxin", - label: "文心一言", - src: $A.mainUrl('avatar/%E6%96%87%E5%BF%83.png'), - desc: this.$L('我是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。') - }, - ], + aibotList: AIBotList, aibotShow: false, aibotSettingShow: false, aibotTabAction: "openai", @@ -483,6 +433,7 @@ export default { this.workReportShow = true; break; case 'robot': + this.getAITags(); this.aibotShow = true; break; case 'robot-setting': @@ -520,6 +471,24 @@ export default { } this.$emit("on-click", item.value) }, + // 获取AI标签 + getAITags() { + this.$store.dispatch("call", { + url: 'system/setting/aibot', + }).then(({data}) => { + for (let key in data) { + const match = key.match(/^(.*?)_models$/); + if (match) { + const value = match[1]; + this.aibotList.map(h => { + if (h.value == value) { + h.tags = AIModelNames(data[key]).map(item => item.label); + } + }); + } + } + }); + }, // 开始聊天 onGoToChat(type) { let dialogId = 0; diff --git a/resources/assets/js/pages/manage/setting/components/SystemAibot.vue b/resources/assets/js/pages/manage/setting/components/SystemAibot.vue index 81a20de34..43bffdf46 100644 --- a/resources/assets/js/pages/manage/setting/components/SystemAibot.vue +++ b/resources/assets/js/pages/manage/setting/components/SystemAibot.vue @@ -57,6 +57,7 @@