diff --git a/apps/web-ele/src/views/ai/knowledge/document/data.ts b/apps/web-ele/src/views/ai/knowledge/document/data.ts new file mode 100644 index 000000000..fda42e4a3 --- /dev/null +++ b/apps/web-ele/src/views/ai/knowledge/document/data.ts @@ -0,0 +1,180 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { AiKnowledgeDocumentApi } from '#/api/ai/knowledge/document'; + +import { AiModelTypeEnum, CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { z } from '#/adapter/form'; +import { getModelSimpleList } from '#/api/ai/model/model'; + +/** 新增/修改的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + component: 'Input', + fieldName: 'name', + label: '知识库名称', + rules: 'required', + }, + { + fieldName: 'description', + label: '知识库描述', + component: 'Textarea', + componentProps: { + rows: 3, + placeholder: '请输入知识库描述', + }, + }, + { + component: 'ApiSelect', + fieldName: 'embeddingModelId', + label: '向量模型', + componentProps: { + api: () => getModelSimpleList(AiModelTypeEnum.EMBEDDING), + labelField: 'name', + valueField: 'id', + allowClear: true, + placeholder: '请选择向量模型', + }, + rules: 'required', + }, + { + fieldName: 'topK', + label: '检索 topK', + component: 'InputNumber', + componentProps: { + placeholder: '请输入检索 topK', + controlsPosition: 'right', + class: '!w-full', + min: 0, + max: 10, + }, + rules: 'required', + }, + { + fieldName: 'similarityThreshold', + label: '检索相似度阈值', + component: 'InputNumber', + componentProps: { + placeholder: '请输入检索相似度阈值', + controlsPosition: 'right', + class: '!w-full', + min: 0, + max: 1, + step: 0.01, + precision: 2, + }, + rules: 'required', + }, + { + fieldName: 'status', + label: '是否启用', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '文件名称', + component: 'Input', + componentProps: { + placeholder: '请输入文件名称', + allowClear: true, + }, + }, + { + fieldName: 'status', + label: '是否启用', + component: 'Select', + componentProps: { + placeholder: '请选择是否启用', + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns( + onStatusChange?: ( + newStatus: number, + row: AiKnowledgeDocumentApi.KnowledgeDocument, + ) => PromiseLike, +): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: '文档编号', + minWidth: 100, + }, + { + field: 'name', + title: '文件名称', + minWidth: 200, + }, + { + field: 'contentLength', + title: '字符数', + minWidth: 100, + }, + { + field: 'tokens', + title: 'Token 数', + minWidth: 100, + }, + { + field: 'segmentMaxTokens', + title: '分片最大 Token 数', + minWidth: 150, + }, + { + field: 'retrievalCount', + title: '召回次数', + minWidth: 100, + }, + { + field: 'status', + title: '是否启用', + minWidth: 100, + align: 'center', + cellRender: { + attrs: { beforeChange: onStatusChange }, + name: 'CellSwitch', + props: { + checkedValue: CommonStatusEnum.ENABLE, + unCheckedValue: CommonStatusEnum.DISABLE, + }, + }, + }, + { + field: 'createTime', + title: '上传时间', + minWidth: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + minWidth: 150, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-ele/src/views/ai/knowledge/document/form/index.vue b/apps/web-ele/src/views/ai/knowledge/document/form/index.vue new file mode 100644 index 000000000..bee03dc25 --- /dev/null +++ b/apps/web-ele/src/views/ai/knowledge/document/form/index.vue @@ -0,0 +1,200 @@ + + + diff --git a/apps/web-ele/src/views/ai/knowledge/document/form/modules/process-step.vue b/apps/web-ele/src/views/ai/knowledge/document/form/modules/process-step.vue new file mode 100644 index 000000000..d94dd9f2a --- /dev/null +++ b/apps/web-ele/src/views/ai/knowledge/document/form/modules/process-step.vue @@ -0,0 +1,159 @@ + + + + diff --git a/apps/web-ele/src/views/ai/knowledge/document/form/modules/split-step.vue b/apps/web-ele/src/views/ai/knowledge/document/form/modules/split-step.vue new file mode 100644 index 000000000..65f4126a9 --- /dev/null +++ b/apps/web-ele/src/views/ai/knowledge/document/form/modules/split-step.vue @@ -0,0 +1,286 @@ + + + diff --git a/apps/web-ele/src/views/ai/knowledge/document/form/modules/upload-step.vue b/apps/web-ele/src/views/ai/knowledge/document/form/modules/upload-step.vue new file mode 100644 index 000000000..456aafd58 --- /dev/null +++ b/apps/web-ele/src/views/ai/knowledge/document/form/modules/upload-step.vue @@ -0,0 +1,270 @@ + + + diff --git a/apps/web-ele/src/views/ai/knowledge/document/index.vue b/apps/web-ele/src/views/ai/knowledge/document/index.vue new file mode 100644 index 000000000..181fea3d8 --- /dev/null +++ b/apps/web-ele/src/views/ai/knowledge/document/index.vue @@ -0,0 +1,192 @@ + + + diff --git a/apps/web-ele/src/views/ai/knowledge/knowledge/data.ts b/apps/web-ele/src/views/ai/knowledge/knowledge/data.ts new file mode 100644 index 000000000..b85233e95 --- /dev/null +++ b/apps/web-ele/src/views/ai/knowledge/knowledge/data.ts @@ -0,0 +1,173 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; + +import { AiModelTypeEnum, CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +import { z } from '#/adapter/form'; +import { getModelSimpleList } from '#/api/ai/model/model'; +import { getRangePickerDefaultProps } from '#/utils'; + +/** 新增/修改的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + component: 'Input', + fieldName: 'name', + label: '知识库名称', + componentProps: { + placeholder: '请输入知识库名称', + }, + rules: 'required', + }, + { + fieldName: 'description', + label: '知识库描述', + component: 'Textarea', + componentProps: { + rows: 3, + placeholder: '请输入知识库描述', + }, + }, + { + component: 'ApiSelect', + fieldName: 'embeddingModelId', + label: '向量模型', + componentProps: { + api: () => getModelSimpleList(AiModelTypeEnum.EMBEDDING), + labelField: 'name', + valueField: 'id', + allowClear: true, + placeholder: '请选择向量模型', + }, + rules: 'required', + }, + { + fieldName: 'topK', + label: '检索 topK', + component: 'InputNumber', + componentProps: { + placeholder: '请输入检索 topK', + controlsPosition: 'right', + class: '!w-full', + min: 0, + max: 10, + }, + rules: 'required', + }, + { + fieldName: 'similarityThreshold', + label: '检索相似度阈值', + component: 'InputNumber', + componentProps: { + placeholder: '请输入检索相似度阈值', + controlsPosition: 'right', + class: '!w-full', + min: 0, + max: 1, + step: 0.01, + precision: 2, + }, + rules: 'required', + }, + { + fieldName: 'status', + label: '是否启用', + component: 'RadioGroup', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + rules: z.number().default(CommonStatusEnum.ENABLE), + }, + ]; +} + +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'name', + label: '知识库名称', + component: 'Input', + componentProps: { + placeholder: '请输入知识库名称', + allowClear: true, + }, + }, + { + fieldName: 'status', + label: '是否启用', + component: 'Select', + componentProps: { + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + placeholder: '请选择是否启用', + allowClear: true, + }, + }, + { + fieldName: 'createTime', + label: '创建时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: '编号', + minWidth: 100, + }, + { + field: 'name', + title: '知识库名称', + minWidth: 150, + }, + { + field: 'description', + title: '知识库描述', + minWidth: 200, + }, + { + field: 'embeddingModel', + title: '向量化模型', + minWidth: 150, + }, + { + field: 'status', + title: '是否启用', + minWidth: 100, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.COMMON_STATUS }, + }, + }, + { + field: 'createTime', + title: '创建时间', + minWidth: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 280, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + diff --git a/apps/web-ele/src/views/ai/knowledge/knowledge/index.vue b/apps/web-ele/src/views/ai/knowledge/knowledge/index.vue new file mode 100644 index 000000000..29db6c688 --- /dev/null +++ b/apps/web-ele/src/views/ai/knowledge/knowledge/index.vue @@ -0,0 +1,166 @@ + + + diff --git a/apps/web-ele/src/views/ai/knowledge/knowledge/modules/form.vue b/apps/web-ele/src/views/ai/knowledge/knowledge/modules/form.vue new file mode 100644 index 000000000..fd439b5b2 --- /dev/null +++ b/apps/web-ele/src/views/ai/knowledge/knowledge/modules/form.vue @@ -0,0 +1,90 @@ + + + + diff --git a/apps/web-ele/src/views/ai/knowledge/knowledge/retrieval/index.vue b/apps/web-ele/src/views/ai/knowledge/knowledge/retrieval/index.vue new file mode 100644 index 000000000..9c99231ed --- /dev/null +++ b/apps/web-ele/src/views/ai/knowledge/knowledge/retrieval/index.vue @@ -0,0 +1,214 @@ + + diff --git a/apps/web-ele/src/views/ai/knowledge/segment/data.ts b/apps/web-ele/src/views/ai/knowledge/segment/data.ts new file mode 100644 index 000000000..bcc52234a --- /dev/null +++ b/apps/web-ele/src/views/ai/knowledge/segment/data.ts @@ -0,0 +1,131 @@ +import type { VbenFormSchema } from '#/adapter/form'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { AiKnowledgeSegmentApi } from '#/api/ai/knowledge/segment'; + +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; + +/** 新增/修改的表单 */ +export function useFormSchema(): VbenFormSchema[] { + return [ + { + component: 'Input', + fieldName: 'id', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + component: 'Input', + fieldName: 'documentId', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + { + fieldName: 'content', + label: '切片内容', + component: 'Textarea', + componentProps: { + placeholder: '请输入切片内容', + rows: 6, + showCount: true, + }, + rules: 'required', + }, + ]; +} +/** 列表的搜索表单 */ +export function useGridFormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'documentId', + label: '文档编号', + component: 'Input', + componentProps: { + placeholder: '请输入文档编号', + allowClear: true, + }, + }, + { + fieldName: 'status', + label: '是否启用', + component: 'Select', + componentProps: { + placeholder: '请选择是否启用', + allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + }, + }, + ]; +} + +/** 列表的字段 */ +export function useGridColumns( + onStatusChange?: ( + newStatus: number, + row: AiKnowledgeSegmentApi.KnowledgeSegment, + ) => PromiseLike, +): VxeTableGridOptions['columns'] { + return [ + { + field: 'id', + title: '分段编号', + minWidth: 100, + }, + { + type: 'expand', + width: 40, + slots: { content: 'expand_content' }, + }, + { + field: 'content', + title: '切片内容', + minWidth: 250, + }, + { + field: 'contentLength', + title: '字符数', + minWidth: 100, + }, + { + field: 'tokens', + title: 'token 数量', + minWidth: 120, + }, + { + field: 'retrievalCount', + title: '召回次数', + minWidth: 100, + }, + { + field: 'status', + title: '状态', + minWidth: 100, + align: 'center', + cellRender: { + attrs: { beforeChange: onStatusChange }, + name: 'CellSwitch', + props: { + checkedValue: CommonStatusEnum.ENABLE, + unCheckedValue: CommonStatusEnum.DISABLE, + }, + }, + }, + { + field: 'createTime', + title: '创建时间', + minWidth: 180, + formatter: 'formatDateTime', + }, + { + title: '操作', + width: 150, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} + diff --git a/apps/web-ele/src/views/ai/knowledge/segment/index.vue b/apps/web-ele/src/views/ai/knowledge/segment/index.vue new file mode 100644 index 000000000..6cfa04b11 --- /dev/null +++ b/apps/web-ele/src/views/ai/knowledge/segment/index.vue @@ -0,0 +1,171 @@ + + + diff --git a/apps/web-ele/src/views/ai/knowledge/segment/modules/form.vue b/apps/web-ele/src/views/ai/knowledge/segment/modules/form.vue new file mode 100644 index 000000000..69b176f6f --- /dev/null +++ b/apps/web-ele/src/views/ai/knowledge/segment/modules/form.vue @@ -0,0 +1,90 @@ + + + +