Skip to content

Commit b9178c8

Browse files
YunaiVgitee-org
authored andcommitted
!469 AI 大模型的草稿提交(code review 代码)
Merge pull request !469 from 芋道源码/dev
2 parents f341ba4 + 9336280 commit b9178c8

File tree

159 files changed

+10446
-361
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

159 files changed

+10446
-361
lines changed

package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"private": false,
77
"scripts": {
88
"i": "pnpm install",
9-
"dev": "vite",
9+
"dev": "vite --mode env.local",
1010
"dev-server": "vite --mode dev",
1111
"ts:check": "vue-tsc --noEmit",
1212
"build:local": "node --max_old_space_size=8192 ./node_modules/vite/bin/vite.js build",
@@ -29,6 +29,7 @@
2929
"@form-create/designer": "^3.1.3",
3030
"@form-create/element-ui": "^3.1.24",
3131
"@iconify/iconify": "^3.1.1",
32+
"@microsoft/fetch-event-source": "^2.0.1",
3233
"@videojs-player/vue": "^1.0.0",
3334
"@vueuse/core": "^10.9.0",
3435
"@wangeditor/editor": "^5.1.23",
@@ -46,11 +47,12 @@
4647
"driver.js": "^1.3.1",
4748
"echarts": "^5.5.0",
4849
"echarts-wordcloud": "^2.1.0",
49-
"element-plus": "2.6.1",
50+
"element-plus": "2.7.0",
5051
"fast-xml-parser": "^4.3.2",
5152
"highlight.js": "^11.9.0",
5253
"jsencrypt": "^3.3.2",
5354
"lodash-es": "^4.17.21",
55+
"marked": "^12.0.2",
5456
"min-dash": "^4.1.1",
5557
"mitt": "^3.0.1",
5658
"nprogress": "^0.2.0",

pnpm-lock.yaml

Lines changed: 20 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/App.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,8 @@ body {
5454
.#{$prefix-cls}-grey-mode {
5555
filter: grayscale(100%);
5656
}
57+
58+
.scrollbar__view {
59+
height: 99%!important;
60+
}
5761
</style>

src/api/ai/chat/conversation/index.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import request from '@/config/axios'
2+
3+
// AI 聊天对话 VO
4+
export interface ChatConversationVO {
5+
id: number // ID 编号
6+
userId: number // 用户编号
7+
title: string // 对话标题
8+
pinned: boolean // 是否置顶
9+
roleId: number // 角色编号
10+
modelId: number // 模型编号
11+
model: string // 模型标志
12+
temperature: number // 温度参数
13+
maxTokens: number // 单条回复的最大 Token 数量
14+
maxContexts: number // 上下文的最大 Message 数量
15+
createTime?: Date // 创建时间
16+
// 额外字段
17+
systemMessage?: string // 角色设定
18+
modelName?: string // 模型名字
19+
roleAvatar?: string // 角色头像
20+
modelMaxTokens?: string // 模型的单条回复的最大 Token 数量
21+
modelMaxContexts?: string // 模型的上下文的最大 Message 数量
22+
}
23+
24+
// AI 聊天对话 API
25+
export const ChatConversationApi = {
26+
// 获得【我的】聊天对话
27+
getChatConversationMy: async (id: number) => {
28+
return await request.get({ url: `/ai/chat/conversation/get-my?id=${id}` })
29+
},
30+
31+
// 新增【我的】聊天对话
32+
createChatConversationMy: async (data?: ChatConversationVO) => {
33+
return await request.post({ url: `/ai/chat/conversation/create-my`, data })
34+
},
35+
36+
// 更新【我的】聊天对话
37+
updateChatConversationMy: async (data: ChatConversationVO) => {
38+
return await request.put({ url: `/ai/chat/conversation/update-my`, data })
39+
},
40+
41+
// 删除【我的】聊天对话
42+
deleteChatConversationMy: async (id: string) => {
43+
return await request.delete({ url: `/ai/chat/conversation/delete-my?id=${id}` })
44+
},
45+
46+
// 删除【我的】所有对话,置顶除外
47+
deleteChatConversationMyByUnpinned: async () => {
48+
return await request.delete({ url: `/ai/chat/conversation/delete-by-unpinned` })
49+
},
50+
51+
// 获得【我的】聊天对话列表
52+
getChatConversationMyList: async () => {
53+
return await request.get({ url: `/ai/chat/conversation/my-list` })
54+
},
55+
56+
// 获得对话分页
57+
getChatConversationPage: async (params: any) => {
58+
return await request.get({ url: `/ai/chat/conversation/page`, params })
59+
},
60+
61+
// 管理员删除消息
62+
deleteChatConversationByAdmin: async (id: number) => {
63+
return await request.delete({ url: `/ai/chat/conversation/delete-by-admin?id=${id}` })
64+
}
65+
}

src/api/ai/chat/message/index.ts

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import request from '@/config/axios'
2+
import { fetchEventSource } from '@microsoft/fetch-event-source'
3+
import { getAccessToken } from '@/utils/auth'
4+
import { config } from '@/config/axios/config'
5+
6+
// 聊天VO
7+
export interface ChatMessageVO {
8+
id: number // 编号
9+
conversationId: number // 对话编号
10+
type: string // 消息类型
11+
userId: string // 用户编号
12+
roleId: string // 角色编号
13+
model: number // 模型标志
14+
modelId: number // 模型编号
15+
content: string // 聊天内容
16+
tokens: number // 消耗 Token 数量
17+
createTime: Date // 创建时间
18+
roleAvatar: string // 角色头像
19+
userAvatar: string // 创建时间
20+
}
21+
22+
// AI chat 聊天
23+
export const ChatMessageApi = {
24+
// 消息列表
25+
getChatMessageListByConversationId: async (conversationId: number | null) => {
26+
return await request.get({
27+
url: `/ai/chat/message/list-by-conversation-id?conversationId=${conversationId}`
28+
})
29+
},
30+
31+
// 发送 Stream 消息
32+
// 为什么不用 axios 呢?因为它不支持 SSE 调用
33+
sendChatMessageStream: async (
34+
conversationId: number,
35+
content: string,
36+
ctrl,
37+
enableContext: boolean,
38+
onMessage,
39+
onError,
40+
onClose
41+
) => {
42+
const token = getAccessToken()
43+
return fetchEventSource(`${config.base_url}/ai/chat/message/send-stream`, {
44+
method: 'post',
45+
headers: {
46+
'Content-Type': 'application/json',
47+
Authorization: `Bearer ${token}`
48+
},
49+
openWhenHidden: true,
50+
body: JSON.stringify({
51+
conversationId,
52+
content,
53+
useContext: enableContext
54+
}),
55+
onmessage: onMessage,
56+
onerror: onError,
57+
onclose: onClose,
58+
signal: ctrl.signal
59+
})
60+
},
61+
62+
// 删除消息
63+
deleteChatMessage: async (id: string) => {
64+
return await request.delete({ url: `/ai/chat/message/delete?id=${id}` })
65+
},
66+
67+
// 删除指定对话的消息
68+
deleteByConversationId: async (conversationId: number) => {
69+
return await request.delete({
70+
url: `/ai/chat/message/delete-by-conversation-id?conversationId=${conversationId}`
71+
})
72+
},
73+
74+
// 获得消息分页
75+
getChatMessagePage: async (params: any) => {
76+
return await request.get({ url: '/ai/chat/message/page', params })
77+
},
78+
79+
// 管理员删除消息
80+
deleteChatMessageByAdmin: async (id: number) => {
81+
return await request.delete({ url: `/ai/chat/message/delete-by-admin?id=${id}` })
82+
}
83+
}

src/api/ai/image/index.ts

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import request from '@/config/axios'
2+
3+
// AI 绘图 VO
4+
export interface ImageVO {
5+
id: number // 编号
6+
platform: string // 平台
7+
model: string // 模型
8+
prompt: string // 提示词
9+
width: number // 图片宽度
10+
height: number // 图片高度
11+
status: number // 状态
12+
publicStatus: boolean // 公开状态
13+
picUrl: string // 任务地址
14+
errorMessage: string // 错误信息
15+
options: any // 配置 Map<string, string>
16+
taskId: number // 任务编号
17+
buttons: ImageMidjourneyButtonsVO[] // mj 操作按钮
18+
createTime: Date // 创建时间
19+
finishTime: Date // 完成时间
20+
}
21+
22+
export interface ImageDrawReqVO {
23+
platform: string // 平台
24+
prompt: string // 提示词
25+
model: string // 模型
26+
style: string // 图像生成的风格
27+
width: string // 图片宽度
28+
height: string // 图片高度
29+
options: object // 绘制参数,Map<String, String>
30+
}
31+
32+
export interface ImageMidjourneyImagineReqVO {
33+
prompt: string // 提示词
34+
model: string // 模型 mj nijj
35+
base64Array: string[] // size不能为空
36+
width: string // 图片宽度
37+
height: string // 图片高度
38+
version: string // 版本
39+
}
40+
41+
export interface ImageMidjourneyActionVO {
42+
id: number // 图片编号
43+
customId: string // MJ::JOB::upsample::1::85a4b4c1-8835-46c5-a15c-aea34fad1862 动作标识
44+
}
45+
46+
export interface ImageMidjourneyButtonsVO {
47+
customId: string // MJ::JOB::upsample::1::85a4b4c1-8835-46c5-a15c-aea34fad1862 动作标识
48+
emoji: string // 图标 emoji
49+
label: string // Make Variations 文本
50+
style: number // 样式: 2(Primary)、3(Green)
51+
}
52+
53+
// AI 图片 API
54+
export const ImageApi = {
55+
// 获取【我的】绘图分页
56+
getImagePageMy: async (params: PageParam) => {
57+
return await request.get({ url: `/ai/image/my-page`, params })
58+
},
59+
// 获取【我的】绘图记录
60+
getImageMy: async (id: number) => {
61+
return await request.get({ url: `/ai/image/get-my?id=${id}` })
62+
},
63+
// 获取【我的】绘图记录列表
64+
getImageListMyByIds: async (ids: number[]) => {
65+
return await request.get({ url: `/ai/image/my-list-by-ids`, params: { ids: ids.join(',') } })
66+
},
67+
// 生成图片
68+
drawImage: async (data: ImageDrawReqVO) => {
69+
return await request.post({ url: `/ai/image/draw`, data })
70+
},
71+
// 删除【我的】绘画记录
72+
deleteImageMy: async (id: number) => {
73+
return await request.delete({ url: `/ai/image/delete-my?id=${id}` })
74+
},
75+
76+
// ================ midjourney 专属 ================
77+
78+
// 【Midjourney】生成图片
79+
midjourneyImagine: async (data: ImageMidjourneyImagineReqVO) => {
80+
return await request.post({ url: `/ai/image/midjourney/imagine`, data })
81+
},
82+
// 【Midjourney】Action 操作(二次生成图片)
83+
midjourneyAction: async (data: ImageMidjourneyActionVO) => {
84+
return await request.post({ url: `/ai/image/midjourney/action`, data })
85+
},
86+
87+
// ================ 绘图管理 ================
88+
89+
// 查询绘画分页
90+
getImagePage: async (params: any) => {
91+
return await request.get({ url: `/ai/image/page`, params })
92+
},
93+
94+
// 更新绘画发布状态
95+
updateImage: async (data: any) => {
96+
return await request.put({ url: '/ai/image/update-public-status', data })
97+
},
98+
99+
// 删除绘画
100+
deleteImage: async (id: number) => {
101+
return await request.delete({ url: `/ai/image/delete?id=` + id })
102+
}
103+
}

0 commit comments

Comments
 (0)