diff --git a/.image/common/ai-feature.png b/.image/common/ai-feature.png
index b4a55f547c85650d1b34e0bf0852a40634ecc99f..552ed59b424610bf8438003a1c839e197bda7eed 100644
Binary files a/.image/common/ai-feature.png and b/.image/common/ai-feature.png differ
diff --git a/README.md b/README.md
index 6ca2dbf96d105abb931e9556e9b37f62d36113fa..099692fb860e6335d842810ff694a26a4da52e98 100644
--- a/README.md
+++ b/README.md
@@ -81,16 +81,13 @@
系统内置多种多种业务功能,可以用于快速你的业务系统:
-* 系统功能
-* 基础设施
-* 工作流程
-* 支付系统
-* 会员中心
-* 数据报表
-* 商城系统
-* 微信公众号
-* ERP 系统
-* CRM 系统
+系统内置多种多种业务功能,可以用于快速你的业务系统:
+
+
+
+* 通用模块(必选):系统功能、基础设施
+* 通用模块(可选):工作流程、支付系统、数据报表、会员中心
+* 业务系统(按需):ERP 系统、CRM 系统、商城系统、微信公众号、AI 大模型
### 系统功能
@@ -213,6 +210,14 @@ ps:核心功能已经实现,正在对接微信小程序中...

+### AI 大模型
+
+演示地址:
+
+
+
+
+
## 🐷 演示图
### 系统功能
diff --git a/src/api/ai/chat/message/index.ts b/src/api/ai/chat/message/index.ts
index ef1196aca94a90eeb97f5d9592ab4ae2d141b5dc..69d9f123e019019af39c020bd7f51dc925a76e4f 100644
--- a/src/api/ai/chat/message/index.ts
+++ b/src/api/ai/chat/message/index.ts
@@ -14,9 +14,16 @@ export interface ChatMessageVO {
modelId: number // 模型编号
content: string // 聊天内容
tokens: number // 消耗 Token 数量
+ segmentIds?: number[] // 段落编号
+ segments?: {
+ id: number // 段落编号
+ content: string // 段落内容
+ documentId: number // 文档编号
+ documentName: string // 文档名称
+ }[]
createTime: Date // 创建时间
roleAvatar: string // 角色头像
- userAvatar: string // 创建时间
+ userAvatar: string // 用户头像
}
// AI chat 聊天
diff --git a/src/api/ai/image/index.ts b/src/api/ai/image/index.ts
index 2f276c7e208871c289eb8340f6174da9f054fa5d..ab2bcf7243cbafb15d2e3624a43f17d7d8a89f5a 100644
--- a/src/api/ai/image/index.ts
+++ b/src/api/ai/image/index.ts
@@ -20,9 +20,8 @@ export interface ImageVO {
}
export interface ImageDrawReqVO {
- platform: string // 平台
prompt: string // 提示词
- model: string // 模型
+ modelId: number // 模型
style: string // 图像生成的风格
width: string // 图片宽度
height: string // 图片高度
@@ -31,7 +30,7 @@ export interface ImageDrawReqVO {
export interface ImageMidjourneyImagineReqVO {
prompt: string // 提示词
- model: string // 模型 mj nijj
+ modelId: number // 模型
base64Array: string[] // size不能为空
width: string // 图片宽度
height: string // 图片高度
diff --git a/src/api/ai/knowledge/document/index.ts b/src/api/ai/knowledge/document/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..62c24d5bb1a60a4ace76d4108fa7d7b5acd1cbee
--- /dev/null
+++ b/src/api/ai/knowledge/document/index.ts
@@ -0,0 +1,54 @@
+import request from '@/config/axios'
+
+// AI 知识库文档 VO
+export interface KnowledgeDocumentVO {
+ id: number // 编号
+ knowledgeId: number // 知识库编号
+ name: string // 文档名称
+ contentLength: number // 字符数
+ tokens: number // token 数
+ segmentMaxTokens: number // 分片最大 token 数
+ retrievalCount: number // 召回次数
+ status: number // 是否启用
+}
+
+// AI 知识库文档 API
+export const KnowledgeDocumentApi = {
+ // 查询知识库文档分页
+ getKnowledgeDocumentPage: async (params: any) => {
+ return await request.get({ url: `/ai/knowledge/document/page`, params })
+ },
+
+ // 查询知识库文档详情
+ getKnowledgeDocument: async (id: number) => {
+ return await request.get({ url: `/ai/knowledge/document/get?id=` + id })
+ },
+
+ // 新增知识库文档(单个)
+ createKnowledgeDocument: async (data: any) => {
+ return await request.post({ url: `/ai/knowledge/document/create`, data })
+ },
+
+ // 新增知识库文档(多个)
+ createKnowledgeDocumentList: async (data: any) => {
+ return await request.post({ url: `/ai/knowledge/document/create-list`, data })
+ },
+
+ // 修改知识库文档
+ updateKnowledgeDocument: async (data: any) => {
+ return await request.put({ url: `/ai/knowledge/document/update`, data })
+ },
+
+ // 修改知识库文档状态
+ updateKnowledgeDocumentStatus: async (data: any) => {
+ return await request.put({
+ url: `/ai/knowledge/document/update-status`,
+ data
+ })
+ },
+
+ // 删除知识库文档
+ deleteKnowledgeDocument: async (id: number) => {
+ return await request.delete({ url: `/ai/knowledge/document/delete?id=` + id })
+ }
+}
diff --git a/src/api/ai/knowledge/knowledge/index.ts b/src/api/ai/knowledge/knowledge/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f9d368375e81925c38c3adedef503e00bd1ea8d5
--- /dev/null
+++ b/src/api/ai/knowledge/knowledge/index.ts
@@ -0,0 +1,44 @@
+import request from '@/config/axios'
+
+// AI 知识库 VO
+export interface KnowledgeVO {
+ id: number // 编号
+ name: string // 知识库名称
+ description: string // 知识库描述
+ embeddingModelId: number // 嵌入模型编号,高质量模式时维护
+ topK: number // topK
+ similarityThreshold: number // 相似度阈值
+}
+
+// AI 知识库 API
+export const KnowledgeApi = {
+ // 查询知识库分页
+ getKnowledgePage: async (params: any) => {
+ return await request.get({ url: `/ai/knowledge/page`, params })
+ },
+
+ // 查询知识库详情
+ getKnowledge: async (id: number) => {
+ return await request.get({ url: `/ai/knowledge/get?id=` + id })
+ },
+
+ // 新增知识库
+ createKnowledge: async (data: KnowledgeVO) => {
+ return await request.post({ url: `/ai/knowledge/create`, data })
+ },
+
+ // 修改知识库
+ updateKnowledge: async (data: KnowledgeVO) => {
+ return await request.put({ url: `/ai/knowledge/update`, data })
+ },
+
+ // 删除知识库
+ deleteKnowledge: async (id: number) => {
+ return await request.delete({ url: `/ai/knowledge/delete?id=` + id })
+ },
+
+ // 获取知识库简单列表
+ getSimpleKnowledgeList: async () => {
+ return await request.get({ url: `/ai/knowledge/simple-list` })
+ }
+}
diff --git a/src/api/ai/knowledge/segment/index.ts b/src/api/ai/knowledge/segment/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d234d99738f5a14869174af416ccc68515dee6c5
--- /dev/null
+++ b/src/api/ai/knowledge/segment/index.ts
@@ -0,0 +1,75 @@
+import request from '@/config/axios'
+
+// AI 知识库分段 VO
+export interface KnowledgeSegmentVO {
+ id: number // 编号
+ documentId: number // 文档编号
+ knowledgeId: number // 知识库编号
+ vectorId: string // 向量库编号
+ content: string // 切片内容
+ contentLength: number // 切片内容长度
+ tokens: number // token 数量
+ retrievalCount: number // 召回次数
+ status: number // 文档状态
+ createTime: number // 创建时间
+}
+
+// AI 知识库分段 API
+export const KnowledgeSegmentApi = {
+ // 查询知识库分段分页
+ getKnowledgeSegmentPage: async (params: any) => {
+ return await request.get({ url: `/ai/knowledge/segment/page`, params })
+ },
+
+ // 查询知识库分段详情
+ getKnowledgeSegment: async (id: number) => {
+ return await request.get({ url: `/ai/knowledge/segment/get?id=` + id })
+ },
+
+ // 删除知识库分段
+ deleteKnowledgeSegment: async (id: number) => {
+ return await request.delete({ url: `/ai/knowledge/segment/delete?id=` + id })
+ },
+
+ // 新增知识库分段
+ createKnowledgeSegment: async (data: KnowledgeSegmentVO) => {
+ return await request.post({ url: `/ai/knowledge/segment/create`, data })
+ },
+
+ // 修改知识库分段
+ updateKnowledgeSegment: async (data: KnowledgeSegmentVO) => {
+ return await request.put({ url: `/ai/knowledge/segment/update`, data })
+ },
+
+ // 修改知识库分段状态
+ updateKnowledgeSegmentStatus: async (data: any) => {
+ return await request.put({
+ url: `/ai/knowledge/segment/update-status`,
+ data
+ })
+ },
+
+ // 切片内容
+ splitContent: async (url: string, segmentMaxTokens: number) => {
+ return await request.get({
+ url: `/ai/knowledge/segment/split`,
+ params: { url, segmentMaxTokens }
+ })
+ },
+
+ // 获取文档处理列表
+ getKnowledgeSegmentProcessList: async (documentIds: number[]) => {
+ return await request.get({
+ url: `/ai/knowledge/segment/get-process-list`,
+ params: { documentIds: documentIds.join(',') }
+ })
+ },
+
+ // 搜索知识库分段
+ searchKnowledgeSegment: async (params: any) => {
+ return await request.get({
+ url: `/ai/knowledge/segment/search`,
+ params
+ })
+ }
+}
diff --git a/src/api/ai/model/chatModel/index.ts b/src/api/ai/model/chatModel/index.ts
deleted file mode 100644
index c2ef4c8d308ac26d5a735a744695ec0a2db74745..0000000000000000000000000000000000000000
--- a/src/api/ai/model/chatModel/index.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import request from '@/config/axios'
-
-// AI 聊天模型 VO
-export interface ChatModelVO {
- id: number // 编号
- keyId: number // API 秘钥编号
- name: string // 模型名字
- model: string // 模型标识
- platform: string // 模型平台
- sort: number // 排序
- status: number // 状态
- temperature: number // 温度参数
- maxTokens: number // 单条回复的最大 Token 数量
- maxContexts: number // 上下文的最大 Message 数量
-}
-
-// AI 聊天模型 API
-export const ChatModelApi = {
- // 查询聊天模型分页
- getChatModelPage: async (params: any) => {
- return await request.get({ url: `/ai/chat-model/page`, params })
- },
-
- // 获得聊天模型列表
- getChatModelSimpleList: async (status?: number) => {
- return await request.get({
- url: `/ai/chat-model/simple-list`,
- params: {
- status
- }
- })
- },
-
- // 查询聊天模型详情
- getChatModel: async (id: number) => {
- return await request.get({ url: `/ai/chat-model/get?id=` + id })
- },
-
- // 新增聊天模型
- createChatModel: async (data: ChatModelVO) => {
- return await request.post({ url: `/ai/chat-model/create`, data })
- },
-
- // 修改聊天模型
- updateChatModel: async (data: ChatModelVO) => {
- return await request.put({ url: `/ai/chat-model/update`, data })
- },
-
- // 删除聊天模型
- deleteChatModel: async (id: number) => {
- return await request.delete({ url: `/ai/chat-model/delete?id=` + id })
- }
-}
diff --git a/src/api/ai/model/chatRole/index.ts b/src/api/ai/model/chatRole/index.ts
index a9fce13c685675d2d8702b38323bc46e161c1663..6c5511a5414e06059e9508ed866629ca7e1338ad 100644
--- a/src/api/ai/model/chatRole/index.ts
+++ b/src/api/ai/model/chatRole/index.ts
@@ -13,6 +13,8 @@ export interface ChatRoleVO {
welcomeMessage: string // 角色设定
publicStatus: boolean // 是否公开
status: number // 状态
+ knowledgeIds?: number[] // 引用的知识库 ID 列表
+ toolIds?: number[] // 引用的工具 ID 列表
}
// AI 聊天角色 分页请求 vo
diff --git a/src/api/ai/model/model/index.ts b/src/api/ai/model/model/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7c485a0aaa2ab231dfa78751121e92413e5dd01c
--- /dev/null
+++ b/src/api/ai/model/model/index.ts
@@ -0,0 +1,54 @@
+import request from '@/config/axios'
+
+// AI 模型 VO
+export interface ModelVO {
+ id: number // 编号
+ keyId: number // API 秘钥编号
+ name: string // 模型名字
+ model: string // 模型标识
+ platform: string // 模型平台
+ type: number // 模型类型
+ sort: number // 排序
+ status: number // 状态
+ temperature?: number // 温度参数
+ maxTokens?: number // 单条回复的最大 Token 数量
+ maxContexts?: number // 上下文的最大 Message 数量
+}
+
+// AI 模型 API
+export const ModelApi = {
+ // 查询模型分页
+ getModelPage: async (params: any) => {
+ return await request.get({ url: `/ai/model/page`, params })
+ },
+
+ // 获得模型列表
+ getModelSimpleList: async (type?: number) => {
+ return await request.get({
+ url: `/ai/model/simple-list`,
+ params: {
+ type
+ }
+ })
+ },
+
+ // 查询模型详情
+ getModel: async (id: number) => {
+ return await request.get({ url: `/ai/model/get?id=` + id })
+ },
+
+ // 新增模型
+ createModel: async (data: ModelVO) => {
+ return await request.post({ url: `/ai/model/create`, data })
+ },
+
+ // 修改模型
+ updateModel: async (data: ModelVO) => {
+ return await request.put({ url: `/ai/model/update`, data })
+ },
+
+ // 删除模型
+ deleteModel: async (id: number) => {
+ return await request.delete({ url: `/ai/model/delete?id=` + id })
+ }
+}
diff --git a/src/api/ai/model/tool/index.ts b/src/api/ai/model/tool/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bfb896a9f55611b1d33e7c805f0f95affdd45eb2
--- /dev/null
+++ b/src/api/ai/model/tool/index.ts
@@ -0,0 +1,42 @@
+import request from '@/config/axios'
+
+// AI 工具 VO
+export interface ToolVO {
+ id: number // 工具编号
+ name: string // 工具名称
+ description: string // 工具描述
+ status: number // 状态
+}
+
+// AI 工具 API
+export const ToolApi = {
+ // 查询工具分页
+ getToolPage: async (params: any) => {
+ return await request.get({ url: `/ai/tool/page`, params })
+ },
+
+ // 查询工具详情
+ getTool: async (id: number) => {
+ return await request.get({ url: `/ai/tool/get?id=` + id })
+ },
+
+ // 新增工具
+ createTool: async (data: ToolVO) => {
+ return await request.post({ url: `/ai/tool/create`, data })
+ },
+
+ // 修改工具
+ updateTool: async (data: ToolVO) => {
+ return await request.put({ url: `/ai/tool/update`, data })
+ },
+
+ // 删除工具
+ deleteTool: async (id: number) => {
+ return await request.delete({ url: `/ai/tool/delete?id=` + id })
+ },
+
+ // 获取工具简单列表
+ getToolSimpleList: async () => {
+ return await request.get({ url: `/ai/tool/simple-list` })
+ }
+}
diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts
index a5a7e449d6d22a78403f4e79bc9d23443c8938ad..c9107cc5551b97cee99f6baefbdd6bf5b151e629 100644
--- a/src/router/modules/remaining.ts
+++ b/src/router/modules/remaining.ts
@@ -633,6 +633,65 @@ const remainingRouter: AppRouteRecordRaw[] = [
icon: 'ep:home-filled',
noCache: false
}
+ },
+ {
+ path: 'knowledge/document',
+ component: () => import('@/views/ai/knowledge/document/index.vue'),
+ name: 'AiKnowledgeDocument',
+ meta: {
+ title: '知识库文档',
+ icon: 'ep:document',
+ noCache: false,
+ activeMenu: '/ai/knowledge'
+ }
+ },
+ {
+ path: 'knowledge/document/create',
+ component: () => import('@/views/ai/knowledge/document/form/index.vue'),
+ name: 'AiKnowledgeDocumentCreate',
+ meta: {
+ title: '创建文档',
+ icon: 'ep:plus',
+ noCache: true,
+ hidden: true,
+ activeMenu: '/ai/knowledge'
+ }
+ },
+ {
+ path: 'knowledge/document/update',
+ component: () => import('@/views/ai/knowledge/document/form/index.vue'),
+ name: 'AiKnowledgeDocumentUpdate',
+ meta: {
+ title: '修改文档',
+ icon: 'ep:edit',
+ noCache: true,
+ hidden: true,
+ activeMenu: '/ai/knowledge'
+ }
+ },
+ {
+ path: 'knowledge/retrieval',
+ component: () => import('@/views/ai/knowledge/knowledge/retrieval/index.vue'),
+ name: 'AiKnowledgeRetrieval',
+ meta: {
+ title: '文档召回测试',
+ icon: 'ep:search',
+ noCache: true,
+ hidden: true,
+ activeMenu: '/ai/knowledge'
+ }
+ },
+ {
+ path: 'knowledge/segment',
+ component: () => import('@/views/ai/knowledge/segment/index.vue'),
+ name: 'AiKnowledgeSegment',
+ meta: {
+ title: '知识库分段',
+ icon: 'ep:tickets',
+ noCache: true,
+ hidden: true,
+ activeMenu: '/ai/knowledge'
+ }
}
]
},
diff --git a/src/utils/dict.ts b/src/utils/dict.ts
index 1134152b69ffc40cf0ffb55682bff11f76b4babe..f572bbe70a23880ebc3a024a7a1306e00f8716e0 100644
--- a/src/utils/dict.ts
+++ b/src/utils/dict.ts
@@ -219,6 +219,7 @@ export enum DICT_TYPE {
// ========== AI - 人工智能模块 ==========
AI_PLATFORM = 'ai_platform', // AI 平台
+ AI_MODEL_TYPE = 'ai_model_type', // AI 模型类型
AI_IMAGE_STATUS = 'ai_image_status', // AI 图片状态
AI_MUSIC_STATUS = 'ai_music_status', // AI 音乐状态
AI_GENERATE_MODE = 'ai_generate_mode', // AI 生成模式
diff --git a/src/utils/index.ts b/src/utils/index.ts
index 7e56e8bedc52efaa0862a808b7537c19748036bf..502ae60211e52579ed299c99a944c7a7198ac332 100644
--- a/src/utils/index.ts
+++ b/src/utils/index.ts
@@ -116,6 +116,64 @@ export function toAnyString() {
return str
}
+/**
+ * 根据支持的文件类型生成 accept 属性值
+ *
+ * @param supportedFileTypes 支持的文件类型数组,如 ['PDF', 'DOC', 'DOCX']
+ * @returns 用于文件上传组件 accept 属性的字符串
+ */
+export const generateAcceptedFileTypes = (supportedFileTypes: string[]): string => {
+ const allowedExtensions = supportedFileTypes.map((ext) => ext.toLowerCase())
+ const mimeTypes: string[] = []
+
+ // 添加常见的 MIME 类型映射
+ if (allowedExtensions.includes('txt')) {
+ mimeTypes.push('text/plain')
+ }
+ if (allowedExtensions.includes('pdf')) {
+ mimeTypes.push('application/pdf')
+ }
+ if (allowedExtensions.includes('html') || allowedExtensions.includes('htm')) {
+ mimeTypes.push('text/html')
+ }
+ if (allowedExtensions.includes('csv')) {
+ mimeTypes.push('text/csv')
+ }
+ if (allowedExtensions.includes('xlsx') || allowedExtensions.includes('xls')) {
+ mimeTypes.push('application/vnd.ms-excel')
+ mimeTypes.push('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
+ }
+ if (allowedExtensions.includes('docx') || allowedExtensions.includes('doc')) {
+ mimeTypes.push('application/msword')
+ mimeTypes.push('application/vnd.openxmlformats-officedocument.wordprocessingml.document')
+ }
+ if (allowedExtensions.includes('pptx') || allowedExtensions.includes('ppt')) {
+ mimeTypes.push('application/vnd.ms-powerpoint')
+ mimeTypes.push('application/vnd.openxmlformats-officedocument.presentationml.presentation')
+ }
+ if (allowedExtensions.includes('xml')) {
+ mimeTypes.push('application/xml')
+ mimeTypes.push('text/xml')
+ }
+ if (allowedExtensions.includes('md') || allowedExtensions.includes('markdown')) {
+ mimeTypes.push('text/markdown')
+ }
+ if (allowedExtensions.includes('epub')) {
+ mimeTypes.push('application/epub+zip')
+ }
+ if (allowedExtensions.includes('eml')) {
+ mimeTypes.push('message/rfc822')
+ }
+ if (allowedExtensions.includes('msg')) {
+ mimeTypes.push('application/vnd.ms-outlook')
+ }
+
+ // 添加文件扩展名
+ const extensions = allowedExtensions.map((ext) => `.${ext}`)
+
+ return [...mimeTypes, ...extensions].join(',')
+}
+
/**
* 首字母大写
*/
diff --git a/src/views/ai/chat/index/components/conversation/ConversationUpdateForm.vue b/src/views/ai/chat/index/components/conversation/ConversationUpdateForm.vue
index bff094fb6f24db0090d860205eff4d7182d5a8c3..90f68c6679398d463509e0feffef158d4089f3d5 100644
--- a/src/views/ai/chat/index/components/conversation/ConversationUpdateForm.vue
+++ b/src/views/ai/chat/index/components/conversation/ConversationUpdateForm.vue
@@ -11,17 +11,17 @@
@@ -32,6 +32,7 @@
:min="0"
:max="2"
:precision="2"
+ class="!w-1/1"
/>
@@ -39,7 +40,8 @@
v-model="formData.maxTokens"
placeholder="请输入回复数 Token 数"
:min="0"
- :max="4096"
+ :max="8192"
+ class="!w-1/1"
/>
@@ -48,6 +50,7 @@
placeholder="请输入上下文数量"
:min="0"
:max="20"
+ class="!w-1/1"
/>
@@ -58,9 +61,9 @@
diff --git a/src/views/ai/chat/index/components/message/MessageList.vue b/src/views/ai/chat/index/components/message/MessageList.vue
index b7402a9e021dec7784d097be9c54c81aba3c09d5..2840bf9444ad9889e6f93f2f34d8eaea7f89c0b0 100644
--- a/src/views/ai/chat/index/components/message/MessageList.vue
+++ b/src/views/ai/chat/index/components/message/MessageList.vue
@@ -12,6 +12,7 @@
+
@@ -62,6 +63,7 @@
import { PropType } from 'vue'
import { formatDate } from '@/utils/formatTime'
import MarkdownView from '@/components/MarkdownView/index.vue'
+import MessageKnowledge from './MessageKnowledge.vue'
import { useClipboard } from '@vueuse/core'
import { ArrowDownBold, Edit, RefreshRight } from '@element-plus/icons-vue'
import { ChatMessageApi, ChatMessageVO } from '@/api/ai/chat/message'
diff --git a/src/views/ai/chat/index/components/role/RoleList.vue b/src/views/ai/chat/index/components/role/RoleList.vue
index b148b220e7a7e883133cd0bcba39cbe012cd050c..e0388d09b44c27d0389633a49220334ef46811bb 100644
--- a/src/views/ai/chat/index/components/role/RoleList.vue
+++ b/src/views/ai/chat/index/components/role/RoleList.vue
@@ -41,9 +41,9 @@
diff --git a/src/views/ai/knowledge/document/form/index.vue b/src/views/ai/knowledge/document/form/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..722f57cf96b1f7ecb5af5a7d95ac6a3933c6c956
--- /dev/null
+++ b/src/views/ai/knowledge/document/form/index.vue
@@ -0,0 +1,193 @@
+
+
+
+
+
+
+
+
+
+ {{ formData.id ? '编辑知识库文档' : '创建知识库文档' }}
+
+
+
+
+
+
+
+
+ {{ index + 1 }}
+
+
{{ step.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/ai/knowledge/document/index.vue b/src/views/ai/knowledge/document/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e8ba711c1ea9f0a2666dfb46725f4b6e7b2fec4c
--- /dev/null
+++ b/src/views/ai/knowledge/document/index.vue
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 分段
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/ai/knowledge/knowledge/KnowledgeForm.vue b/src/views/ai/knowledge/knowledge/KnowledgeForm.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d72f37caf06e1cb8280753e13a070d68bdb4e3ff
--- /dev/null
+++ b/src/views/ai/knowledge/knowledge/KnowledgeForm.vue
@@ -0,0 +1,162 @@
+
+
+
+
diff --git a/src/views/ai/knowledge/knowledge/index.vue b/src/views/ai/knowledge/knowledge/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a768c6b8012a8ce44b5c9c0c686a79bd57d6ceaf
--- /dev/null
+++ b/src/views/ai/knowledge/knowledge/index.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 文档
+
+
+ 召回测试
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/ai/knowledge/knowledge/retrieval/index.vue b/src/views/ai/knowledge/knowledge/retrieval/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..aca521a34d87d4c4b18b8e38e9bb63a5862b1c52
--- /dev/null
+++ b/src/views/ai/knowledge/knowledge/retrieval/index.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
+
召回测试
+
根据给定的查询文本测试召回效果。
+
+
+
+
+
+ {{ queryParams.content?.length }} / 200
+
+
+
+ topK:
+
+
+
+ 相似度:
+
+
+
+ 测试
+
+
+
+
+
+
+
+
+ {{ segments.length }} 个召回段落
+
+
+
+
+
+
+ 分段({{ segment.id }}) · {{ segment.contentLength }} 字符数 ·
+ {{ segment.tokens }} Token
+
+
+ score: {{ segment.score }}
+
+
+
+ {{ segment.content }}
+
+
+
+
+ {{ segment.documentName || '未知文档' }}
+
+
+ {{ segment.expanded ? '收起' : '展开' }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/ai/knowledge/segment/KnowledgeSegmentForm.vue b/src/views/ai/knowledge/segment/KnowledgeSegmentForm.vue
new file mode 100644
index 0000000000000000000000000000000000000000..4818de0104bc57eae150020db7437da3d409fe07
--- /dev/null
+++ b/src/views/ai/knowledge/segment/KnowledgeSegmentForm.vue
@@ -0,0 +1,101 @@
+
+
+
+
diff --git a/src/views/ai/knowledge/segment/index.vue b/src/views/ai/knowledge/segment/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e2f8a67f398c03190c00b35260a6445730a5d25d
--- /dev/null
+++ b/src/views/ai/knowledge/segment/index.vue
@@ -0,0 +1,242 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 完整内容:
+
+ {{ props.row.content }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/ai/mindmap/index/components/Left.vue b/src/views/ai/mindmap/index/components/Left.vue
index e684b887463c57bad95a9def1fe9a93869d16ceb..5c3dbf0d1756081367cb7e499ad516383024f3f3 100644
--- a/src/views/ai/mindmap/index/components/Left.vue
+++ b/src/views/ai/mindmap/index/components/Left.vue
@@ -8,7 +8,7 @@
+
+
+
+
@@ -32,6 +32,21 @@
+
+
+
+
+
+
+
+
+
+
{
@@ -128,7 +150,11 @@ const open = async (type: string, id?: number, title?: string) => {
}
}
// 获得下拉数据
- chatModelList.value = await ChatModelApi.getChatModelSimpleList(CommonStatusEnum.ENABLE)
+ models.value = await ModelApi.getModelSimpleList(AiModelTypeEnum.CHAT)
+ // 获取知识库列表
+ knowledgeList.value = await KnowledgeApi.getSimpleKnowledgeList()
+ // 获取工具列表
+ toolList.value = await ToolApi.getToolSimpleList()
}
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
@@ -176,7 +202,9 @@ const resetForm = () => {
description: undefined,
systemMessage: undefined,
publicStatus: true,
- status: CommonStatusEnum.ENABLE
+ status: CommonStatusEnum.ENABLE,
+ knowledgeIds: [],
+ toolIds: []
}
formRef.value?.resetFields()
}
diff --git a/src/views/ai/model/chatRole/index.vue b/src/views/ai/model/chatRole/index.vue
index e870a5563a307d52dabdae748452e89eb53fa19f..0ba0d79dff3c77598be6abfccbf5512ab48c309d 100644
--- a/src/views/ai/model/chatRole/index.vue
+++ b/src/views/ai/model/chatRole/index.vue
@@ -1,4 +1,6 @@
+
+
+
+
+ -
+ 引用 {{ scope.row.knowledgeIds.length }} 个
+
+
+
+
+ -
+ 引用 {{ scope.row.toolIds.length }} 个
+
+
diff --git a/src/views/ai/model/chatModel/ChatModelForm.vue b/src/views/ai/model/model/ModelForm.vue
similarity index 76%
rename from src/views/ai/model/chatModel/ChatModelForm.vue
rename to src/views/ai/model/model/ModelForm.vue
index ed9747a6b9aedce28d9d23d34eb73293eafd769a..a27ca0fd0dfb10d35c3faf9151f186cc0cb14e46 100644
--- a/src/views/ai/model/chatModel/ChatModelForm.vue
+++ b/src/views/ai/model/model/ModelForm.vue
@@ -17,6 +17,21 @@
/>
+
+
+
+
+
-
+
-
+
-
+
@@ -80,13 +110,14 @@
diff --git a/src/views/ai/model/tool/index.vue b/src/views/ai/model/tool/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..583b3e1881f475a36f87fed84fb3275374e5fd3f
--- /dev/null
+++ b/src/views/ai/model/tool/index.vue
@@ -0,0 +1,178 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+ 新增
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/ai/music/manager/index.vue b/src/views/ai/music/manager/index.vue
index e1b94112a6349ed9cb00f1ee7795732129af6606..27daf1353f7e62659b107a67f7c61a7b0d3c02c9 100644
--- a/src/views/ai/music/manager/index.vue
+++ b/src/views/ai/music/manager/index.vue
@@ -1,4 +1,6 @@
+
+
+
+
-
+
搜索
重置
-
- 新增
-
-
-
- 导出
-
@@ -143,15 +132,6 @@
-
-
- 编辑
-
{
handleQuery()
}
-/** 新增方法,跳转到写作页面 **/
-const openForm = (type: string, id?: number) => {
- switch (type) {
- case 'create':
- router.push('/ai/write')
- break
- }
-}
-
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
diff --git a/src/views/bpm/model/form/index.vue b/src/views/bpm/model/form/index.vue
index 96ce5b91d12f1bb4aa6f3820d858f14b38d9baa1..a4a346f153eb99a79514c9cdd2d6388599ece602 100644
--- a/src/views/bpm/model/form/index.vue
+++ b/src/views/bpm/model/form/index.vue
@@ -359,6 +359,16 @@ const handleStepClick = async (index: number) => {
// 切换步骤
currentStep.value = index
+
+ // 如果切换到流程设计步骤,等待组件渲染完成后刷新设计器
+ if (index === 2) {
+ await nextTick()
+ // 等待更长时间确保组件完全初始化
+ await new Promise((resolve) => setTimeout(resolve, 200))
+ if (processDesignRef.value?.refresh) {
+ await processDesignRef.value.refresh()
+ }
+ }
} catch (error) {
console.error('步骤切换失败:', error)
message.warning('请先完善当前步骤必填信息')