From 2ca3c164a004c6d076f48090a8195793c9c63dcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=98=93?= <105188049+xiaoyiweb@users.noreply.github.com> Date: Sun, 4 Feb 2024 18:51:37 +0800 Subject: [PATCH] =?UTF-8?q?2.5=E7=89=88=E6=9C=AC=20=E5=A2=9E=E5=8A=A0dall-?= =?UTF-8?q?e=20=E4=BC=98=E5=8C=96mj=20=E5=AF=B9=E6=8E=A5mj-plus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 14340 -> 14340 bytes .vscode/extensions.json | 3 + .vscode/settings.json | 78 +- README.md | 125 + admin/package.json | 2 +- admin/src/constants/index.ts | 2 + admin/src/router/modules/mj.menu.ts | 20 +- admin/src/views/chat/midjourney.vue | 202 +- admin/src/views/mjDraw/draw.vue | 248 +- admin/src/views/mjDraw/proxy.vue | 264 +- admin/src/views/models/key.vue | 165 +- build.sh | 33 + chat/electron/appMenu.js | 4 +- chat/electron/windowManager.js | 2 +- chat/index.html | 5 + chat/package.json | 204 +- chat/src/api/index.ts | 220 +- chat/src/api/mjDraw.ts | 8 +- chat/src/assets/voice.gif | Bin 0 -> 12165 bytes chat/src/components/base/Loading.vue | 45 +- .../components/common/GridManager2/index.vue | 377 + .../{GridManager => OldGridManager}/index.vue | 2 +- chat/src/store/modules/chat/helper.ts | 3 +- chat/src/store/modules/users/helper.ts | 2 +- chat/src/styles/global.less | 7 - chat/src/views/chat/chatBase.vue | 120 +- .../views/chat/components/Header/index.vue | 21 +- .../views/chat/components/Message/Text.vue | 214 +- .../views/chat/components/Message/index.vue | 10 +- chat/src/views/draw/index.vue | 14 +- chat/src/views/inpaint/index.vue | 4 +- chat/src/views/market/index.vue | 284 +- .../views/midjourney/components/cardItem.vue | 848 +- chat/src/views/midjourney/index.vue | 825 +- chat/src/views/mind/index.vue | 2 +- chat/vite.config.ts | 4 +- package.json | 11 +- pnpm-lock.yaml | 13696 ++++++++++------ service/.DS_Store | Bin 14340 -> 10244 bytes service/package.json | 5 +- service/pm2.conf.json | 2 +- service/public/index.html | 11 +- service/src/.DS_Store | Bin 10244 -> 10244 bytes .../src/modules/chatgpt/chatgpt.service.ts | 54 +- service/src/modules/chatgpt/openai.ts | 255 +- service/src/modules/chatgpt/store.ts | 5 +- .../src/modules/database/database.service.ts | 62 +- .../modules/midjourney/midjourney.entity.ts | 19 +- .../modules/midjourney/midjourney.service.ts | 1066 +- .../src/modules/models/dto/setModel.dto.ts | 8 +- .../src/modules/models/modelType.entity.ts | 3 + service/src/modules/models/models.entity.ts | 4 + service/src/modules/models/models.service.ts | 201 +- service/src/modules/queue/dto/mjDraw.dto.ts | 8 +- service/src/modules/queue/queue.service.ts | 87 +- service/src/modules/task/task.service.ts | 12 +- service/src/modules/upload/upload.service.ts | 56 +- 57 files changed, 12239 insertions(+), 7693 deletions(-) create mode 100644 .vscode/extensions.json create mode 100755 build.sh create mode 100644 chat/src/assets/voice.gif create mode 100644 chat/src/components/common/GridManager2/index.vue rename chat/src/components/common/{GridManager => OldGridManager}/index.vue (99%) diff --git a/.DS_Store b/.DS_Store index 8d3c13a8e7fbece35076dc8a5ec1edf2bc2bca3c..0df1bdaeb444f0e7c06352a2f99f9168d9930360 100644 GIT binary patch delta 1905 zcmeH{YiyHM7{{Og+1yIk>Sk{%>$0 z^Z%WvH_{vFTWcsKq70&3q9AopXtTE~6bL6qi`l(6GqFd<^|@MeCY4c}tVV<3sw#gV z?3Zg)?LT^ty*XNuofy+5vsIZYtzKp`shQfTiK6VVA1|4W0&N~|b2u209h6}(YA@={ zb2wRT9!j2bG(vO^@=~XTuPay-AE)o>H#$#$01(K41_qdr4>KHa!Gm%v!gAb%)wmg6 z)S(`C;x4q}9t03X2>0TC#PJ}uV>kBUQ9Ooz4B!R4h?kJWQGA3E9LFd40$<`Qe2a7V z9p{A*8le@J3saWJ7iLkwlLa0=pm!%5ENbxMr2`ivy4Y(q`rN3%3fzcQQpPQ~6}7kn zJ}E|#vJvg*KqsPzNjY1v4L#_^4(!A(DT$>hMbaP+;2AuN*YG;tz(E|wd-wpueAMdU zc9Y?HL;us2gF_>g>8BP9x6C^6SM^AH+KD@P*i;zTP>90RLao#&y;gq3C?KQmba!eG z1qbB+%-NexKw@|QjIO`wpV3)Cs(-Q|U3f%{5uY{{@W0dIFu>e=$YLsCas<2YJwmt<-0~*ni zf+mbj*gTC*Pnt_l;rSFgQ|`QvVVuAze2&xj2EX7eeiaaEks~x}VH8E8Tr3t#c$414 zPD@2{XUUb|w!(oai9X*HFx6Ox+i*K-a5pxf3C$@9VMNe{Zrq0lq>Sx&2z&4d_M#67 zJb@>%ABq%(;aBh~-o`sPgm-Z)#q!7ev$KpRtX7r1Qs_=fWMrV{1x4ztsRS=AvWt~{ z+)%V0d91OS((Z8mXP4L@hIX6@3A_{~E+Vbk*&o9063 zfQ@zbvtrp^&TuRd8Xu2a47}E{kxy83^XfX9!y#|Sw$|jR<6($0QYM;uUhxXIavVgw z!D+zDJg(c1I*#j$xu&FCXx7ZJhpjY!?mdned+-yVv=%4W#;#l~&(C#dtfT)g#=pN9 X)yZu4WM+;x+7yj-OVj={`{w@%D=6@M delta 1299 zcmeH{TS!z<6o%J-W^$xa8FNOPoSci7hB6r)m4XsPv#d8`hJ!6q_h6I?sD>#|Az`s?mb_4SV>D?F2dqQYP9 zj}V?Rrw9h}TnG;%l2b8N&_SxT)z`Rfc5lr+o-kG^S2i{#ByEf}Sd%Q=r3yzI53BTO z=hrH&EM(*ue^yz!O#4W@9$5&%Imz~jG~N;2$%VQo-m12UL%J2<%r#weT0W(#6qiZhK`7zcJdq`I0S5^C`7@ndSHtH|sR~#1zA^!GmJ-Dk)=D zvy@TC2STh(6ZCBqXV7jLN|KQ3lVoPh`V@(=XilJjN>id;XP&qL68Y@AxH@G6V?i` z!g>x>$8(D=S*%wt2am4qnzxt|x+Omj8>Hhiunn2mi7ezI5Bb>dwNZ`=9KvDLqE52X zfTL)^DV)YxoWn(2!ey_W9$djyT*EEgMn48Hj0bp#5greX=WKnrU-$4gS-i+@y}|dX z=3afEkWs`#`rV$%0t9e?L0ec|rT2C#j>@HuEWz`}z)unubRP+``2MahCV~3g#EC|O zfR~(WjPN6BPHi9HZljtzi~+u-2`YYUoEFR{Su`d2z_l0s0`9Vy1RuCwZ5~`B!?f!^ YH2)r&JW*l!B + + +# 项目部署教程 +## 环境准备 + +1. **安装Node.js环境** + - 请根据您的操作系统下载并安装Node.js。 + - 可以从[Node.js官网](https://nodejs.org/)下载。 + +2. **安装PM2** + - 使用npm安装PM2:`npm install pm2 -g` + - PM2是一个带有负载均衡功能的Node应用的进程管理器。 + +3. **安装PNPM** + - 使用npm安装PNPM:`npm install -g pnpm` + - PNPM是一个快速、节省磁盘空间的包管理工具。 + +## 配置项目 + +1. **配置环境变量** + - 复制`.env.example`文件为`.env`。 + - 根据需要修改`.env`文件中的配置项。 + +2. **安装项目依赖** + - 运行命令:`pnpm install`(若安装失败可尝试使用国内源) + - 这将根据`package.json`文件安装所有必需的依赖。 + +## 启动项目 + +1. **启动服务** + - 使用命令:`pnpm start` + - 这将启动项目,并默认在9520端口监听。 + +2. **访问项目** + - 在浏览器中访问`http://localhost:9520`,或者如果配置了nginx反向代理,则通过配置的域名访问。 + +## 管理平台 + +- **管理端地址**:`/` +- **普通管理员账号**:`admin` +- **超级管理员账号**:`super` +- **密码**:`123456` + +普通管理员,可以预览后台非敏感信息。登入后台后请及时修改管理员密码,或按需要禁用普通管理员。 + +请确保遵循上述步骤进行配置和启动,以保证系统的正确运行。 + +## 项目升级 + +1. **拉取更新** + + - 拉取新的整合包:`git pull` + +2. **删除旧进程** + + - 删除旧的 PM2 进程。 + +3. **安装依赖** + + - 运行命令:`pnpm install` 以安装 `package.json` 中定义的必需依赖。 + +4. **启动服务** + - 使用命令:`pnpm start` 来启动项目,它将默认在 9520 端口监听。 + +## 作者wx + + + + + + + + # NineAI 更新整合版 ## 更新日志 diff --git a/admin/package.json b/admin/package.json index 7768325..7c69d8f 100644 --- a/admin/package.json +++ b/admin/package.json @@ -1,5 +1,5 @@ { - "version": "2.4.0", + "version": "2.5.0", "scripts": { "dev": "vite", "build:test": "vue-tsc --noEmit && vite build --mode test", diff --git a/admin/src/constants/index.ts b/admin/src/constants/index.ts index 7fdc558..c363d49 100644 --- a/admin/src/constants/index.ts +++ b/admin/src/constants/index.ts @@ -174,6 +174,7 @@ export const MODEL_LIST = [ "gpt-4-vision-preview", "gpt-4-all", "gpt-4-0125-preview", + 'dall-e-3', // claude "claude-2.0", "claude-2.1", @@ -293,6 +294,7 @@ export const MODELSMAPLIST = { "gpt-4-vision-preview", "gpt-4-all", "gpt-4-0125-preview", + 'dall-e-3', // claude "claude-2.0", "claude-2.1", diff --git a/admin/src/router/modules/mj.menu.ts b/admin/src/router/modules/mj.menu.ts index 2221efc..faf3ff2 100644 --- a/admin/src/router/modules/mj.menu.ts +++ b/admin/src/router/modules/mj.menu.ts @@ -23,21 +23,21 @@ const routes: RouteRecordRaw = { icon: 'menu-history', }, }, - { - path: 'config', - name: 'mjManage', - component: () => import('@/views/mjDraw/index.vue'), - meta: { - title: '参数配置', - icon: 'menu-params', - }, - }, + // { + // path: 'config', + // name: 'mjManage', + // component: () => import('@/views/mjDraw/index.vue'), + // meta: { + // title: '参数配置', + // icon: 'menu-params', + // }, + // }, { path: 'proxy', name: 'mjProxyManage', component: () => import('@/views/mjDraw/proxy.vue'), meta: { - title: '更多设置', + title: '参数配置', icon: 'menu-proxy', }, }, diff --git a/admin/src/views/chat/midjourney.vue b/admin/src/views/chat/midjourney.vue index cb29078..c908679 100644 --- a/admin/src/views/chat/midjourney.vue +++ b/admin/src/views/chat/midjourney.vue @@ -1,20 +1,23 @@ meta: title: MJ绘画管理 - + - +} + diff --git a/admin/src/views/mjDraw/draw.vue b/admin/src/views/mjDraw/draw.vue index 12d5a14..2850f64 100644 --- a/admin/src/views/mjDraw/draw.vue +++ b/admin/src/views/mjDraw/draw.vue @@ -1,82 +1,85 @@ meta: title: key列表 - + - - - + @@ -694,12 +703,10 @@ onMounted(() => { - - - + @@ -711,12 +718,10 @@ onMounted(() => { - - - + @@ -732,9 +737,7 @@ onMounted(() => { 如果设置了模型的最大token和返回量、那么两个限制会同时生效! - - - + @@ -750,9 +753,7 @@ onMounted(() => { 保证每个key的调用顺序以及限制每次调用的准确次数 - - - + @@ -768,9 +769,9 @@ onMounted(() => { /> { /> @@ -789,15 +790,13 @@ onMounted(() => { 基础绘画来自于OPENAI的DALL-E模型、所以需要为官方的apiKey、请确定至少设置一张key为基础绘画key即可使用绘画功能!同时当前版本的mind思维导图和mj联想绘图等功能都会走当前设置的key,会后后续版本解除此限制! - - - + @@ -806,12 +805,10 @@ onMounted(() => { 基于 token 计费,计费方式为(基础消费 * token消耗) - - - + - + { { - - diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..b5c90da --- /dev/null +++ b/build.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +set -e + +cd admin/ +pnpm build +cd .. + +cd chat/ +pnpm build +cd .. + +cd service/ +pnpm build +cd .. + +rm -rf AIWebQuickDeploy/dist/* AIWebQuickDeploy/public/* AIWebQuickDeploy/templates/* + +mkdir -p AIWebQuickDeploy/dist AIWebQuickDeploy/public/admin AIWebQuickDeploy/templates + +cp service/pm2.conf.json AIWebQuickDeploy/pm2.conf.json +cp service/package.json AIWebQuickDeploy/package.json +cp service/README.md AIWebQuickDeploy/README.md +cp service/.env.example AIWebQuickDeploy/.env.example +cp service/Dockerfile AIWebQuickDeploy/Dockerfile +cp service/docker-compose.yml AIWebQuickDeploy/docker-compose.yml + +cp -r service/templates/* AIWebQuickDeploy/templates +cp -r service/dist/* AIWebQuickDeploy/dist +cp -r admin/dist/* AIWebQuickDeploy/public/admin +cp -r chat/dist/* AIWebQuickDeploy/public + +echo "打包完成" diff --git a/chat/electron/appMenu.js b/chat/electron/appMenu.js index e9a361d..274db72 100644 --- a/chat/electron/appMenu.js +++ b/chat/electron/appMenu.js @@ -5,11 +5,11 @@ const path = require('path') function configureAppMenu(mainWindow) { let tray = new Tray(path.join(__dirname, '../icons/16x16.png')); - // tray.setToolTip('Nine Ai'); + // tray.setToolTip('YiAi Ai'); const template = [ { - label: 'NineAi', + label: 'YiAi', submenu: [ { label: '退出应用', diff --git a/chat/electron/windowManager.js b/chat/electron/windowManager.js index 3283ff7..ddf2412 100644 --- a/chat/electron/windowManager.js +++ b/chat/electron/windowManager.js @@ -26,7 +26,7 @@ function createMainWindow() { if (app.isPackaged) { // mainWindow.loadFile(filePath) - mainWindow.loadURL('https://ai.jiangly.com') + // mainWindow.loadURL('https://ai.jiangly.com') } else { mainWindow.loadURL('http://127.0.0.1:1002') diff --git a/chat/index.html b/chat/index.html index 07819aa..92d43d6 100644 --- a/chat/index.html +++ b/chat/index.html @@ -190,6 +190,11 @@ } } } + + console.log( + "%c本项目作者----小易,联系QQ:805239273", + "background-color:rgb(30,30,30);border-radius:4px;font-size:12px;padding:4px;color:rgb(220,208,129);" + ) diff --git a/chat/package.json b/chat/package.json index 023cdf7..92ab56b 100644 --- a/chat/package.json +++ b/chat/package.json @@ -1,106 +1,106 @@ { - "name": "chatgpt-cooper", - "version": "2.3.0", - "private": true, - "description": "ChatGPT Cooper", - "author": "Snine ", - "keywords": [ - "chatgpt-cooper", - "chatgpt", - "chatbot", - "vue", - "nestjs" - ], - "main": "electron/main.js", - "scripts": { - "start:h": "pnpm run -C service dev", - "start:f": "vite", - "all": "npm-run-all --parallel start:h start:f", - "dev": "vite", - "build-check": "run-p type-check build-only", - "preview": "vite preview", - "build": "vite build --mode=production", - "type-check": "vue-tsc --noEmit", - "lint": "eslint .", - "lint:fix": "eslint . --fix", - "bootstrap": "pnpm install && pnpm run common:prepare", - "start": "pnpm dev && electron .", - "ele": "electron .", - "common:cleanup": "rimraf node_modules && rimraf pnpm-lock.yaml", - "pack:mac": "NPM_CONFIG_ELECTRON_MIRROR=http://npm.taobao.org/mirrors/electron/ electron-builder build --mac", - "pack:win": "NPM_CONFIG_ELECTRON_MIRROR=http://npm.taobao.org/mirrors/electron/ electron-builder build --win --ia32" - }, - "dependencies": { - "@electron/remote": "^2.1.0", - "@icon-park/vue-next": "^1.4.2", - "@traptitech/markdown-it-katex": "^3.6.0", - "@types/dom-to-image": "^2.6.4", - "@types/file-saver": "^2.0.5", - "@vicons/ionicons5": "^0.12.0", - "@vueuse/core": "^9.13.0", - "@vueuse/electron": "^10.2.1", - "@vueuse/integrations": "^10.2.0", - "@vueuse/motion": "^2.0.0", - "add": "^2.0.6", - "clientjs": "^0.2.1", - "date-fns": "^2.30.0", - "dom-to-image": "^2.6.0", - "file-saver": "^2.0.5", - "highlight.js": "^11.7.0", - "html-to-image": "^1.11.11", - "html2canvas": "^1.4.1", - "katex": "^0.16.4", - "markdown-it": "^13.0.1", - "marked": "^4.3.0", - "markmap-common": "0.14.2", - "markmap-lib": "0.14.4", - "markmap-view": "0.14.4", - "naive-ui": "^2.34.3", - "pinia": "^2.0.33", - "qrcode": "^1.5.3", - "v-viewer": "3.0.11", - "vue": "^3.2.47", - "vue-clipboard3": "^2.0.0", - "vue-i18n": "^9.2.2", - "vue-router": "^4.1.6" - }, - "devDependencies": { - "@antfu/eslint-config": "^0.35.3", - "@commitlint/cli": "^17.4.4", - "@commitlint/config-conventional": "^17.4.4", - "@iconify/vue": "^4.1.0", - "@types/crypto-js": "^4.1.1", - "@types/katex": "^0.16.0", - "@types/markdown-it": "^12.2.3", - "@types/markdown-it-link-attributes": "^3.0.1", - "@types/node": "^18.14.6", - "@vitejs/plugin-vue": "^4.0.0", - "autoprefixer": "^10.4.13", - "axios": "^1.3.4", - "crypto-js": "^4.1.1", - "electron": "^25.3.1", - "electron-builder": "^24.4.0", - "eslint": "^8.35.0", - "husky": "^8.0.3", - "less": "^4.1.3", - "lint-staged": "^13.1.2", - "markdown-it-link-attributes": "^4.0.1", - "npm-run-all": "^4.1.5", - "postcss": "^8.4.21", - "rimraf": "^4.2.0", - "tailwindcss": "^3.2.7", - "typescript": "~4.9.5", - "vite": "^4.2.0", - "vite-plugin-pwa": "^0.14.4", - "vue-tsc": "^1.2.0" - }, - "lint-staged": { - "*.{ts,tsx,vue}": [ - "pnpm lint:fix" - ] - }, - "build": { - "productName": "NineAi", + "name": "chatgpt-cooper", + "version": "2.5.0", + "private": true, + "description": "ChatGPT Cooper", + "author": "Yi ", + "keywords": [ + "chatgpt-cooper", + "chatgpt", + "chatbot", + "vue", + "nestjs" + ], + "main": "electron/main.js", + "scripts": { + "start:h": "pnpm run -C service dev", + "start:f": "vite", + "all": "npm-run-all --parallel start:h start:f", + "dev": "vite", + "build-check": "run-p type-check build-only", + "preview": "vite preview", + "build": "vite build --mode=production", + "type-check": "vue-tsc --noEmit", + "lint": "eslint .", + "lint:fix": "eslint . --fix", + "bootstrap": "pnpm install && pnpm run common:prepare", + "start": "pnpm dev && electron .", + "ele": "electron .", + "common:cleanup": "rimraf node_modules && rimraf pnpm-lock.yaml", + "pack:mac": "NPM_CONFIG_ELECTRON_MIRROR=http://npm.taobao.org/mirrors/electron/ electron-builder build --mac", + "pack:win": "NPM_CONFIG_ELECTRON_MIRROR=http://npm.taobao.org/mirrors/electron/ electron-builder build --win --ia32" + }, + "dependencies": { + "@electron/remote": "^2.1.0", + "@icon-park/vue-next": "^1.4.2", + "@traptitech/markdown-it-katex": "^3.6.0", + "@types/dom-to-image": "^2.6.4", + "@types/file-saver": "^2.0.5", + "@vicons/ionicons5": "^0.12.0", + "@vueuse/core": "^9.13.0", + "@vueuse/electron": "^10.2.1", + "@vueuse/integrations": "^10.2.0", + "@vueuse/motion": "^2.0.0", + "add": "^2.0.6", + "clientjs": "^0.2.1", + "date-fns": "^2.30.0", + "dom-to-image": "^2.6.0", + "file-saver": "^2.0.5", + "highlight.js": "^11.7.0", + "html-to-image": "^1.11.11", + "html2canvas": "^1.4.1", + "katex": "^0.16.4", + "markdown-it": "^13.0.1", + "marked": "^4.3.0", + "markmap-common": "0.14.2", + "markmap-lib": "0.14.4", + "markmap-view": "0.14.4", + "naive-ui": "^2.37.3", + "pinia": "^2.0.33", + "qrcode": "^1.5.3", + "v-viewer": "3.0.11", + "vue": "^3.2.47", + "vue-clipboard3": "^2.0.0", + "vue-i18n": "^9.2.2", + "vue-router": "^4.1.6" + }, + "devDependencies": { + "@antfu/eslint-config": "^0.35.3", + "@commitlint/cli": "^17.4.4", + "@commitlint/config-conventional": "^17.4.4", + "@iconify/vue": "^4.1.0", + "@types/crypto-js": "^4.1.1", + "@types/katex": "^0.16.0", + "@types/markdown-it": "^12.2.3", + "@types/markdown-it-link-attributes": "^3.0.1", + "@types/node": "^18.14.6", + "@vitejs/plugin-vue": "^4.0.0", + "autoprefixer": "^10.4.13", + "axios": "^1.3.4", + "crypto-js": "^4.1.1", + "electron": "^25.3.1", + "electron-builder": "^24.4.0", + "eslint": "^8.35.0", + "husky": "^8.0.3", + "less": "^4.1.3", + "lint-staged": "^13.1.2", + "markdown-it-link-attributes": "^4.0.1", + "npm-run-all": "^4.1.5", + "postcss": "^8.4.21", + "rimraf": "^4.2.0", + "tailwindcss": "^3.2.7", + "typescript": "~4.9.5", + "vite": "^4.2.0", + "vite-plugin-pwa": "^0.14.4", + "vue-tsc": "^1.2.0" + }, + "lint-staged": { + "*.{ts,tsx,vue}": [ + "pnpm lint:fix" + ] + }, + "build": { + "productName": "Yiai", "appId": "ai.jiangly.com", "icon": "icons/icon.icns", "directories": { diff --git a/chat/src/api/index.ts b/chat/src/api/index.ts index 9c50440..860f551 100644 --- a/chat/src/api/index.ts +++ b/chat/src/api/index.ts @@ -1,165 +1,223 @@ -import type { AxiosProgressEvent, GenericAbortSignal } from 'axios' -import { get, post } from '@/utils/request' -import { useSettingStore } from '@/store' +import type { AxiosProgressEvent, GenericAbortSignal } from "axios"; +import { get, post } from "@/utils/request"; +import { useSettingStore } from "@/store"; /* 流失对话聊天 */ -export function fetchChatAPIProcess( - params: { - prompt: string - appId?: number - options?: { conversationId?: string; parentMessageId?: string; temperature: number } - imageUrl?:string - model?:string - signal?: GenericAbortSignal - onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void }, -) { - return post({ - url: '/chatgpt/chat-process', - data: { prompt: params.prompt, appId: params?.appId, options: params.options,imageUrl: params.imageUrl,model: params.model}, - signal: params.signal, - onDownloadProgress: params.onDownloadProgress, - }) +export function fetchChatAPIProcess(params: { + prompt: string; + appId?: number; + options?: { + conversationId?: string; + parentMessageId?: string; + temperature: number; + }; + imageUrl?: string; + model?: string; + signal?: GenericAbortSignal; + onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void; +}) { + return post({ + url: "/chatgpt/chat-process", + data: { + prompt: params.prompt, + appId: params?.appId, + options: params.options, + imageUrl: params.imageUrl, + model: params.model, + }, + signal: params.signal, + onDownloadProgress: params.onDownloadProgress, + }); } /* 获取个人信息 */ export function fetchGetInfo() { - return get({ url: '/auth/getInfo' }) + return get({ url: "/auth/getInfo" }); } /* 注册 */ -export function fetchRegisterAPI(data: { username: string;password: string;email: string }): Promise { - return post({ url: '/auth/register', data }) as Promise +export function fetchRegisterAPI(data: { + username: string; + password: string; + email: string; +}): Promise { + return post({ url: "/auth/register", data }) as Promise; } /* 注册 */ -export function fetchRegisterByPhoneAPI(data: { username: string;password: string; phone: string; phoneCode: string }): Promise { - return post({ url: '/auth/registerByPhone', data }) as Promise +export function fetchRegisterByPhoneAPI(data: { + username: string; + password: string; + phone: string; + phoneCode: string; +}): Promise { + return post({ url: "/auth/registerByPhone", data }) as Promise; } /* 登录 */ -export function fetchLoginAPI(data: { username: string; password: string }): Promise { - return post({ url: '/auth/login', data }) as Promise +export function fetchLoginAPI(data: { + username: string; + password: string; +}): Promise { + return post({ url: "/auth/login", data }) as Promise; } /* 手机号登录 */ -export function fetchLoginByPhoneAPI(data: { phone: string; password: string }): Promise { - return post({ url: '/auth/loginByPhone', data }) as Promise +export function fetchLoginByPhoneAPI(data: { + phone: string; + password: string; +}): Promise { + return post({ url: "/auth/loginByPhone", data }) as Promise; } /* 修改个人信息 */ -export function fetchUpdateInfoAPI(data: { username?: string; avatar?: string }): Promise { - return post({ url: '/user/update', data }) as Promise +export function fetchUpdateInfoAPI(data: { + username?: string; + avatar?: string; +}): Promise { + return post({ url: "/user/update", data }) as Promise; } /* 获取个人绘画记录 */ export function fetchGetChatLogDraw(data: { model: string }): Promise { - return get({ url: '/chatLog/draw', data }) as Promise + return get({ url: "/chatLog/draw", data }) as Promise; } /* 获取所有绘画记录 */ -export function fetchGetAllChatLogDraw(data: { size: number; rec: number; model: string }): Promise { - return get({ url: '/chatLog/drawAll', data }) as Promise +export function fetchGetAllChatLogDraw(data: { + size: number; + rec: number; + model: string; +}): Promise { + return get({ url: "/chatLog/drawAll", data }) as Promise; } /* chatgpt的dall-e2绘画 */ -export function fetchChatDraw(data: { prompt: string;n: number;size: string }): Promise { - return post({ url: '/chatgpt/chat-draw', data }) as Promise +export function fetchChatDraw(data: { + prompt: string; + n: number; + size: string; +}): Promise { + return post({ url: "/chatgpt/chat-draw", data }) as Promise; } /* 修改密码 */ -export function fetchUpdatePasswordAPI(data: { oldPassword?: string;password?: string }): Promise { - return post({ url: '/auth/updatePassword', data }) as Promise +export function fetchUpdatePasswordAPI(data: { + oldPassword?: string; + password?: string; +}): Promise { + return post({ url: "/auth/updatePassword", data }) as Promise; } /* 同步对话 */ -export function fetchGetchatSyncApi( - params: { - prompt: string - options?: { conversationId?: string; parentMessageId?: string; temperature: number } - signal?: GenericAbortSignal - onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void }, -) { - return post({ - url: '/chatgpt/chat-sync', - data: { prompt: params.prompt, options: params.options }, - signal: params.signal, - onDownloadProgress: params.onDownloadProgress, - }) +export function fetchGetchatSyncApi(params: { + prompt: string; + options?: { + conversationId?: string; + parentMessageId?: string; + temperature: number; + }; + signal?: GenericAbortSignal; + onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void; +}) { + return post({ + url: "/chatgpt/chat-sync", + data: { prompt: params.prompt, options: params.options }, + signal: params.signal, + onDownloadProgress: params.onDownloadProgress, + }); } /* 获取mind绘画联想词 */ -export function fetchGetchatMindApi( - params: { - prompt: string - options?: { conversationId?: string; parentMessageId?: string; temperature: number } - signal?: GenericAbortSignal - onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void }, -) { - return post({ - url: '/chatgpt/chat-mind', - data: { prompt: params.prompt, options: params.options }, - signal: params.signal, - onDownloadProgress: params.onDownloadProgress, - }) +export function fetchGetchatMindApi(params: { + prompt: string; + options?: { + conversationId?: string; + parentMessageId?: string; + temperature: number; + }; + signal?: GenericAbortSignal; + onDownloadProgress?: (progressEvent: AxiosProgressEvent) => void; +}) { + return post({ + url: "/chatgpt/chat-mind", + data: { prompt: params.prompt, options: params.options }, + signal: params.signal, + onDownloadProgress: params.onDownloadProgress, + }); } /* 获取MJ绘画联想词 */ -export function fetchGetMjPromptAssociateApi(data: { prompt: string }): Promise { - return post({ url: '/chatgpt/mj-associate', data }) as Promise +export function fetchGetMjPromptAssociateApi(data: { + prompt: string; +}): Promise { + return post({ url: "/chatgpt/mj-associate", data }) as Promise; } /* 获取MJ绘画联想词 */ -export function fetchGetMjPromptFanyiApi(data: { prompt: string }): Promise { - return post({ url: '/chatgpt/mj-fy', data }) as Promise +export function fetchGetMjPromptFanyiApi(data: { + prompt: string; +}): Promise { + return post({ url: "/chatgpt/mj-fy", data }) as Promise; } /* 获取我得绘制列表 */ -export function fetchMidjourneyDrawList(data: { page?: number; size?: number }): Promise { - return get({ url: '/midjourney/drawList', data }) as Promise +export function fetchMidjourneyDrawList(data: { + page?: number; + size?: number; +}): Promise { + return get({ url: "/midjourney/drawList", data }) as Promise; } /* 获取Mj提示词 */ export function fetchMidjourneyPromptList(): Promise { - return get({ url: '/midjourney/queryPrompts' }) as Promise + return get({ url: "/midjourney/queryPrompts" }) as Promise; } /* 获取Mj完整提示词 */ export function fetchMidjourneyFullPrompt(data: any): Promise { - return get({ url: '/midjourney/getFullPrompt', data }) as Promise + return get({ url: "/midjourney/getFullPrompt", data }) as Promise; } /* 删除MJ绘画记录 */ export function fetchDownloadImg(data: { id: number }): Promise { - return post({ url: '/midjourney/delete', data }) as Promise + return post({ url: "/midjourney/delete", data }) as Promise; } /* 获取我得绘制列表 */ -export function fetchMidjourneyGetList(data: { page?: number; size?: number; rec: number }): Promise { - return get({ url: '/midjourney/getList', data }) as Promise +export function fetchMidjourneyGetList(data: { + page?: number; + size?: number; + rec: number; +}): Promise { + return get({ url: "/midjourney/getList", data }) as Promise; } /* 推荐图片 */ export function fetchRecDraw(data: { id: number }): Promise { - return post({ url: '/midjourney/rec', data }) as Promise + return post({ url: "/midjourney/rec", data }) as Promise; } /* 获取图片验证码 */ export function fetchCaptchaImg(data: { color: string }): Promise { - return post({ url: '/auth/captcha', data }) as Promise + return post({ url: "/auth/captcha", data }) as Promise; } /* 发送手机验证码 */ -export function fetchSendSms(data: { phone: string; captchaId: string; captchaCode: string }): Promise { - return post({ url: '/auth/sendPhoneCode', data }) as Promise +export function fetchSendSms(data: { + phone: string; + captchaId: string; + captchaCode: string; +}): Promise { + return post({ url: "/auth/sendPhoneCode", data }) as Promise; } /* 获取九宫格设置 */ export function fetchGetChatBoxList() { - return get({ url: '/chatgpt/queryChatBoxFrontend' }) + return get({ url: "/chatgpt/queryChatBoxFrontend" }); } - /* 获取快问设置 */ export function fetchGetChatPreList() { - return get({ url: '/chatgpt/queryChatPreList' }) + return get({ url: "/chatgpt/queryChatPreList" }); } diff --git a/chat/src/api/mjDraw.ts b/chat/src/api/mjDraw.ts index 501a525..2db7d1e 100644 --- a/chat/src/api/mjDraw.ts +++ b/chat/src/api/mjDraw.ts @@ -33,7 +33,7 @@ export function fetchTranslateAPI(data: { text: string }): Promise { } /* 提交一个绘画任务 */ -export function fetchDrawTaskAPI(data: { prompt?: string; imgUrl?: string; extraParam?: string; drawId?: number; action?: number; orderId?: number }): Promise { +export function fetchDrawTaskAPI(data: { prompt?: string; imgUrl?: string; extraParam?: string; drawId?: number; action?: string; orderId?: number }): Promise { return post({ url: '/queue/addMjDrawQueue', data, @@ -45,8 +45,8 @@ export function fetchProxyImgAPI(data: { url: string }): Promise { return get({ url: '/midjourney/proxy', data, - headers: { - responseType: 'arraybuffer' - } + headers: { + responseType: 'arraybuffer' + } }) } diff --git a/chat/src/assets/voice.gif b/chat/src/assets/voice.gif new file mode 100644 index 0000000000000000000000000000000000000000..880edb44776799becd5c0a4fe6f3e41cb094f387 GIT binary patch literal 12165 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, { gap: 10, progress: 0, tips: '', - words: ['L', 'O', 'A', 'D', 'I', 'N', 'G'] + // words: ['L', 'O', 'A', 'D', 'I', 'N', 'G'] + words: ['AI', '绘', '画', '中'], }) const appStore = useAppStore() const theme = computed(() => appStore.theme) -const loadingTextColor = computed(() => theme.value === 'dark' ? '#fff' : '#000') +const loadingTextColor = computed(() => + theme.value === 'dark' ? '#fff' : '#000' +) interface Props { gap?: number progress?: number tips?: string bgColor?: string - words?: any + words?: any } // const words = ref(['L', 'O', 'A', 'D', 'I', 'N', 'G']) @@ -27,7 +30,13 @@ interface Props { diff --git a/chat/src/views/chat/components/Header/index.vue b/chat/src/views/chat/components/Header/index.vue index 65cc12a..5387bc6 100644 --- a/chat/src/views/chat/components/Header/index.vue +++ b/chat/src/views/chat/components/Header/index.vue @@ -61,11 +61,9 @@ const themeOptions: { ] const modelName = computed(() => { - if (!chatStore.activeConfig) - return + if (!chatStore.activeConfig) return const { modelTypeInfo, modelInfo } = chatStore.activeConfig - if (!modelTypeInfo || !modelInfo) - return + if (!modelTypeInfo || !modelInfo) return return `${modelTypeInfo?.label} / ${modelInfo.modelName}` }) @@ -85,8 +83,7 @@ function handleUpdateCollapsed() { function onScrollToTop() { const scrollRef = document.querySelector('#scrollRef') - if (scrollRef) - nextTick(() => (scrollRef.scrollTop = 0)) + if (scrollRef) nextTick(() => (scrollRef.scrollTop = 0)) } function handleExport() { @@ -180,7 +177,7 @@ function handleSignIn() { --> - + 删除本页内容 @@ -227,7 +226,9 @@ function handleSignIn() { class="flex h-8 w-8 items-center justify-center rounded border transition hover:bg-[#eef0f3] dark:border-neutral-700 dark:hover:bg-[#33373c]" @click="handleScrollBtm" > - + 滚动到底部 diff --git a/chat/src/views/chat/components/Message/Text.vue b/chat/src/views/chat/components/Message/Text.vue index dda33bf..6d30a88 100644 --- a/chat/src/views/chat/components/Message/Text.vue +++ b/chat/src/views/chat/components/Message/Text.vue @@ -4,11 +4,13 @@ import MarkdownIt from 'markdown-it' import mdKatex from '@traptitech/markdown-it-katex' import mila from 'markdown-it-link-attributes' import hljs from 'highlight.js' -import { NButton, NIcon } from 'naive-ui' +import { NButton, NIcon, NImage } from 'naive-ui' import { Copy, Delete } from '@icon-park/vue-next' import { useAppStore } from '@/store' import { useBasicLayout } from '@/hooks/useBasicLayout' import { t } from '@/locales' +import { SvgIcon } from '@/components/common' + interface Props { inversion?: boolean error?: boolean @@ -22,6 +24,7 @@ interface Emit { (ev: 'regenerate'): void (ev: 'delete'): void (ev: 'copy'): void + (ev: 'video'): void } const props = defineProps() @@ -106,6 +109,10 @@ function handleRegenerate() { emit('regenerate') } +function hendleVideo() { + emit('video') +} + function handleCopy() { emit('copy') } @@ -118,106 +125,137 @@ defineExpose({ textRef })