Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion ui/src/api/API_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,8 @@ MCP 入口加载配置后打开只读及复制弹窗;分词索引入口仅调
已有配置,文件数量与大小限制仍作为知识库顶层字段提交。

`putSyncWebKnowledge(knowledgeId, syncType)` 使用 PUT 请求 `/<knowledgeId>/sync`,
查询参数 `sync_type` 为 `replace`(替换同步)或 `complete`(整体同步),不传请求体。
Workspace 与 System 资源管理接口的查询参数 `sync_type` 均支持 `incremental`(增量同步)、
`replace`(替换同步)和 `complete`(整体同步),不传请求体。
仅用于 Web 知识库;页面负责方式选择、覆盖提示、loading 与任务提交成功提示。

知识库创建通过 `postKnowledge`、`postWebKnowledge` 分别提交到 `/base`、`/web`;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { del, get, getExportFile, put } from '@/api/admin/core/request'
import type { ParamsPage, ResponsePage } from '@/api/admin/core/types'
import type { Dict, KnowledgeDetail, KnowledgeItem, KnowledgeGeneratePayload } from '@/api/types'
import type { Dict, KnowledgeDetail, KnowledgeItem, KnowledgeGeneratePayload, KnowledgeSyncType } from '@/api/types'

const prefix = '/system/resource/knowledge'

Expand Down Expand Up @@ -39,7 +39,7 @@ const putReEmbeddingKnowledge = (knowledgeId: string) => {
}

/** 同步 Web 知识库。 */
const putSyncWebKnowledge = (knowledgeId: string, syncType: 'replace' | 'complete') => {
const putSyncWebKnowledge = (knowledgeId: string, syncType: KnowledgeSyncType) => {
return put<undefined, boolean>(`${prefix}/${knowledgeId}/sync`, undefined, { sync_type: syncType })
}

Expand Down
3 changes: 2 additions & 1 deletion ui/src/api/admin/workspace/knowledge/knowledge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import type {
KnowledgeDetail,
KnowledgeItem,
KnowledgeGeneratePayload,
KnowledgeSyncType,
KnowledgeCreatePayload,
WebKnowledgeCreatePayload,
LarkKnowledgeCreatePayload,
Expand Down Expand Up @@ -72,7 +73,7 @@ const putReEmbeddingKnowledge = (knowledgeId: string) => {
}

/** 同步 Web 知识库。 */
const putSyncWebKnowledge = (knowledgeId: string, syncType: 'replace' | 'complete') => {
const putSyncWebKnowledge = (knowledgeId: string, syncType: KnowledgeSyncType) => {
return put<undefined, boolean>(`${getPrefix()}/${knowledgeId}/sync`, undefined, { sync_type: syncType })
}

Expand Down
3 changes: 3 additions & 0 deletions ui/src/api/enums/knowledge.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
/** 后端知识库类型。 */
export const KNOWLEDGE_TYPE = { BASE: 0, WEB: 1, LARK: 2, WORKFLOW: 4 } as const

/** Web 知识库同步方式。 */
export const KNOWLEDGE_SYNC_TYPE = { INCREMENTAL: 'incremental', REPLACE: 'replace', COMPLETE: 'complete' } as const

/** 知识库分段检索模式。 */
export const KNOWLEDGE_SEARCH_MODE = { EMBEDDING: 'embedding', KEYWORDS: 'keywords', BLEND: 'blend' } as const
4 changes: 3 additions & 1 deletion ui/src/api/types/knowledge.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/** Workspace 知识库列表和知识库卡片共用的业务类型。 */

import type LogicFlow from '@logicflow/core'
import { KNOWLEDGE_TYPE } from '@/api/enums'
import { KNOWLEDGE_SYNC_TYPE, KNOWLEDGE_TYPE } from '@/api/enums'
import type { DefaultModelSettingPayload } from './model'
import type { DocumentTaskState } from './document'

Expand All @@ -19,6 +19,8 @@ export interface KnowledgeGeneratePayload extends RelatedQuestionsConfig {

export type KnowledgeType = (typeof KNOWLEDGE_TYPE)[keyof typeof KNOWLEDGE_TYPE]

export type KnowledgeSyncType = (typeof KNOWLEDGE_SYNC_TYPE)[keyof typeof KNOWLEDGE_SYNC_TYPE]

export interface KnowledgeItem {
application_mapping_count?: number
char_length?: number | null
Expand Down
1 change: 0 additions & 1 deletion ui/src/constants/knowledge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ export const KNOWLEDGE_TYPE_KEY = {
BASE: 'BASE',
WEB: 'WEB',
LARK: 'LARK',
YUQUE: 'YUQUE',
WORKFLOW: 'WORKFLOW',
} as const

Expand Down
18 changes: 16 additions & 2 deletions ui/src/router/ROUTE_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,9 @@ Workspace 页面:
/admin/workspace/:workspaceId/knowledge/:knowledgeId/:type
/admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/document
/admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/setting
/admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/setting/base
/admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/setting/document-strategy
/admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/setting/scheduled-sync
/admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/workflow-entry
/admin/workspace/:workspaceId/knowledge/:knowledgeId/:type/document/:documentId
```
Expand Down Expand Up @@ -344,8 +347,19 @@ System 共享资源页面:
普通和共享文档路由均引用 `library/document/index.vue`,文件分组不增加 URL 层级。
检索优化使用 `/retrieval/recall`、`/retrieval/question`、`/retrieval/dictionary`;
授权与集成使用 `/integration/chat-user`、`/integration/external-retrieval`。
分组不挂载页面组件,直接访问分组时重定向到首个子页。新增七个页面暂为占位 View。`setting`
渲染 `knowledge-detail/setting/index.vue`,使用容器提供的知识库详情。`workflow-entry`
分组不挂载页面组件,直接访问分组时重定向到首个子页。新增七个页面暂为占位 View。
设置菜单使用 `detailMenuVisible(params)` 按知识库类型筛选,不增加权限判断:
通用知识库保留单个“设置”,沿用 `/setting` 和 `workspace-knowledge-setting`;
Web 展示“设置 → 基础设置、文档处理策略、定时同步”;飞书和工作流展示
“设置 → 基础设置、定时同步”。设置分组使用空 path,子页分别使用
`/setting/base`、`/setting/document-strategy`、`/setting/scheduled-sync`,路由名分别为
`workspace-knowledge-base-setting`、`workspace-knowledge-document-strategy`、
`workspace-knowledge-scheduled-sync`。基础设置与通用设置复用
`knowledge-detail/setting/base/index.vue` 和容器提供的详情,其他两个设置页暂为占位。
设置路由不配置类型访问守卫,菜单显隐由 `detailMenuVisible` 控制。
列表设置按钮按知识库类型直接进入通用设置或基础设置。
`workspace-knowledge-settings` 仅提供菜单分组层级,
命名访问时重定向到基础设置,保留参数、query 和 hash。`workflow-entry`
仅作为目录跳转入口,重定向到独立的 `workflow-knowledge` 全屏画布。画布返回知识库详情。
文档详情路由当前尚未启用;后续接入时通过 `detailActiveMenu` 高亮“文档”。

Expand Down
44 changes: 42 additions & 2 deletions ui/src/router/admin/workspace/modules/knowledge.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type { RouteRecordRaw } from 'vue-router'
import { KNOWLEDGE_TYPE_KEY } from '@/constants/knowledge'

export const knowledgeRoutes: RouteRecordRaw[] = [
{
Expand Down Expand Up @@ -101,8 +102,47 @@ export const knowledgeRoutes: RouteRecordRaw[] = [
{
path: 'setting',
name: 'workspace-knowledge-setting',
component: () => import('@/views/knowledge-detail/setting/index.vue'),
meta: { title: '设置', icon: 'icon_setting', activeIcon: 'icon_setting_filled', order: 50 },
component: () => import('@/views/knowledge-detail/setting/base/index.vue'),
meta: {
title: '设置',
icon: 'icon_setting',
activeIcon: 'icon_setting_filled',
order: 50,
detailMenuVisible: (params) => params.type === KNOWLEDGE_TYPE_KEY.BASE,
},
},
{
// 设置分组只提供菜单层级,子页面统一使用 setting 前缀。
path: '',
name: 'workspace-knowledge-settings',
redirect: (to) => ({ name: 'workspace-knowledge-base-setting', params: to.params, query: to.query, hash: to.hash }),
meta: {
title: '设置',
icon: 'icon_setting',
activeIcon: 'icon_setting_filled',
order: 50,
detailMenuVisible: (params) => params.type !== KNOWLEDGE_TYPE_KEY.BASE,
},
children: [
{
path: 'setting/base',
name: 'workspace-knowledge-base-setting',
component: () => import('@/views/knowledge-detail/setting/base/index.vue'),
meta: { title: '基础设置', order: 10 },
},
{
path: 'setting/document-strategy',
name: 'workspace-knowledge-document-strategy',
component: () => import('@/views/knowledge-detail/setting/document-strategy/index.vue'),
meta: { title: '文档处理策略', order: 20, detailMenuVisible: (params) => params.type === KNOWLEDGE_TYPE_KEY.WEB },
},
{
path: 'setting/scheduled-sync',
name: 'workspace-knowledge-scheduled-sync',
component: () => import('@/views/knowledge-detail/setting/scheduled-sync/index.vue'),
meta: { title: '定时同步', order: 30 },
},
],
},
],
},
Expand Down
20 changes: 16 additions & 4 deletions ui/src/views/VIEW_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -217,11 +217,14 @@ src/views/knowledge/
直接调用 `putReEmbeddingKnowledge`,提交成功后提示“提交成功”;复用页面操作 loading,
阻止重复提交并在请求结束后恢复,不额外增加权限判断或配置弹窗。
`SyncKnowledgeAction` 仅在非共享 Web 知识库菜单展示,不增加权限判断。专属弹窗按需挂载、
关闭后卸载,默认“替换同步”,也支持“整体同步”,并展示数据覆盖提示;调用
关闭后卸载,默认“增量同步”,也支持“替换同步”和“整体同步”;增量同步提示跳过未更新文档、
更新已变更文档的分段,其他方式展示数据覆盖提示;调用
`putSyncWebKnowledge`,成功提示“同步任务发送成功”并关闭。复用页面操作 loading,
提交期间禁止重复提交和关闭,失败保留弹窗与当前选择。
`SettingKnowledgeAction` 暂不增加权限判断,点击后携带当前
`workspaceId`、知识库 ID 和 `KNOWLEDGE_TYPE_MAP[knowledge.type]` 跳转 `workspace-knowledge-setting`;阻止事件冒泡,避免同时触发卡片详情跳转。
`workspaceId`、知识库 ID 和 `KNOWLEDGE_TYPE_MAP[knowledge.type]`,通用类型跳转
`workspace-knowledge-setting`,其他类型直接跳转 `workspace-knowledge-base-setting`;
阻止事件冒泡,避免同时触发卡片详情跳转。
“设置”之后依次组合 `KeywordIndexKnowledgeAction` 和 `McpConfigKnowledgeAction`,接收完整
Knowledge API 并复用页面操作 loading。分词索引不增加确认弹窗,调用成功后只提示“操作成功”;
MCP 配置沿用工具的只读文本与悬浮复制交互,专属弹窗按需挂载、关闭后卸载。
Expand All @@ -245,6 +248,8 @@ MCP 配置沿用工具的只读文本与悬浮复制交互,专属弹窗按需
通过 `doc_strategy` 提交;智能分段默认策略与后端一致,高级分段使用与触发器类型相同的卡片外壳,
在选中卡片内展开配置,默认选择一级至四级标题标识、500–4096 分段长度、256 子块长度并开启自动清洗。
分段标识支持自定义正则表达式,留空使用后端默认规则;启用视觉增强后必须选择模型或工具。
视觉模型和工具选项按当前资源范围选择 Workspace、System 资源管理或 System 共享资源的完整 API,
通过 `isSystemResource()`、`isSystemSharedResource()` 判断,供应商继续使用共用 Provider API。

`ButtonCreateKnowledge` 内聚四类创建浮层 Ref 和打开动作,列表页传入目标 `folderId`,通过
`refresh` 刷新列表。入口支持 `trigger` 插槽替换默认创建按钮,下拉使用 `persistent`。
Expand Down Expand Up @@ -448,7 +453,9 @@ Dialog。新增或重命名文件时,应同步更新所有导入和页面功
| `home/index.vue` | Workspace 首页 |
| `knowledge/index.vue` | 工作空间知识库目录与知识库卡片页面 |
| `knowledge-detail/index.vue` | 知识库详情页面 |
| `knowledge-detail/setting/index.vue` | 知识库基本信息、来源配置与上传限制设置 |
| `knowledge-detail/setting/base/index.vue` | 知识库基本信息、来源配置与上传限制设置 |
| `knowledge-detail/setting/document-strategy/index.vue` | Web 知识库文档处理策略占位页面 |
| `knowledge-detail/setting/scheduled-sync/index.vue` | Web、飞书与工作流知识库定时同步占位页面 |
| `login/index.vue` | Admin 登录页面 |
| `login/forgot-password/index.vue` | 忘记密码页面 |
| `model/index.vue` | 工作空间模型目录与模型卡片页面 |
Expand Down Expand Up @@ -694,7 +701,12 @@ Workspace API 内部通过 `getWorkspaceId()` 读取当前路由工作空间。
图片、标签管理及这五个页面暂只展示占位内容。
容器通过 `knowledge-detail/context.ts` 提供只读详情与替换能力;设置页复用已加载详情,保存成功后
更新容器数据,同步名称等展示。基本信息复用创建流程的 `KnowledgeBaseForm`,类型配置和校验留在
设置页中。当前设置页仅接入 Workspace 路由和 API,暂不增加前端权限判断。
`setting/base/index.vue` 中,通用知识库标题为“设置”,其他类型为“基础设置”。
通用知识库只有单个设置菜单;Web 的设置分组包含基础设置、文档处理策略、定时同步,
飞书和工作流包含基础设置、定时同步。`setting/document-strategy/` 与
`setting/scheduled-sync/` 分别承接文档处理策略和定时同步,当前仅展示占位内容。
设置菜单的类型筛选由路由维护,不在 View 中重复维护菜单。
当前设置页仅接入 Workspace 路由和 API,暂不增加前端权限判断。
更换向量模型需确认,先保存再重新向量化,整条流程禁止重复提交;向量化失败时保留原模型比较基准,
允许再次保存重试。Web、飞书设置保留未编辑的 `meta` 字段,上传限制使用详情顶层值。
`knowledge-detail/library/document/index.vue` 维护文档列表查询、多选和文档操作,使用 `MkComplexSearch`、`MkTable`。
Expand Down
2 changes: 1 addition & 1 deletion ui/src/views/knowledge-detail/library/document/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -444,7 +444,7 @@ onBeforeUnmount(() => {
/> -->
<!-- 同步 -->
<SyncDocumentAction
v-if="knowledgeType === KNOWLEDGE_TYPE_KEY.WEB || knowledgeType === KNOWLEDGE_TYPE_KEY.LARK"
v-if="knowledgeType !== KNOWLEDGE_TYPE_KEY.BASE"
label="同步"
:api="DocumentApi"
:knowledge-id="knowledgeId"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ import type { KnowledgeItem } from '@/api/types'
import { KNOWLEDGE_TYPE_LABELS, KNOWLEDGE_TYPE_MAP } from '@/constants/knowledge'
import { MsgConfirm, MsgSuccess } from '@/utils/message'
import KnowledgeBaseForm from '@/views/knowledge/create-knowledge/components/KnowledgeBaseForm.vue'
import { useKnowledgeDetailContext } from '../context'
import { useKnowledgeDetailContext } from '../../context'

defineOptions({ name: 'KnowledgeSettingView' })
defineOptions({ name: 'KnowledgeBaseSettingView' })

const { knowledge, replaceKnowledgeDetail } = useKnowledgeDetailContext()

Expand Down
11 changes: 11 additions & 0 deletions ui/src/views/knowledge-detail/setting/document-strategy/index.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<script setup lang="ts">
import type { ResourceDetailPageProps } from '@/layout/ResourceDetailLayout.vue'

defineOptions({ name: 'KnowledgeDocumentStrategyView' })

defineProps<ResourceDetailPageProps>()
</script>

<template>
<div class="flex-center min-h-0 flex-1 text-N500">文档处理策略功能待接入</div>
</template>
11 changes: 11 additions & 0 deletions ui/src/views/knowledge-detail/setting/scheduled-sync/index.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<script setup lang="ts">
import type { ResourceDetailPageProps } from '@/layout/ResourceDetailLayout.vue'

defineOptions({ name: 'KnowledgeScheduledSyncView' })

defineProps<ResourceDetailPageProps>()
</script>

<template>
<div class="flex-center min-h-0 flex-1 text-N500">定时同步功能待接入</div>
</template>
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,14 @@ import { computed, onMounted, reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
import type { DocumentStrategy, ModelItem, ModelProviderItem, ToolItem } from '@/api/types'
import ModelApi from '@/api/admin/workspace/model'
import SystemResourceModelApi from '@/api/admin/system/resource-management/model'
import SystemSharedModelApi from '@/api/admin/system/shared-resources/model'
import ProviderApi from '@/api/admin/model-provider'
import ToolApi from '@/api/admin/workspace/tool/tool'
import SystemResourceToolApi from '@/api/admin/system/resource-management/tool/tool'
import SystemSharedToolApi from '@/api/admin/system/shared-resources/tool/tool'
import SelectModel from '@/components/business/select-model/index.vue'
import { isSystemResource, isSystemSharedResource } from '@/utils/resource-context'

defineOptions({ name: 'DocumentStrategyForm' })

Expand Down Expand Up @@ -61,6 +66,16 @@ function getStrategy(): DocumentStrategy {
}

/* 视觉模型与工具选项 */
const requestModelApi = computed(() => {
if (isSystemResource()) return SystemResourceModelApi
if (isSystemSharedResource()) return SystemSharedModelApi
return ModelApi
})
const requestToolApi = computed(() => {
if (isSystemResource()) return SystemResourceToolApi
if (isSystemSharedResource()) return SystemSharedToolApi
return ToolApi
})
const optionsLoading = ref(false)
const modelOptions = ref<ModelItem[]>([])
const providerOptions = ref<ModelProviderItem[]>([])
Expand All @@ -69,9 +84,9 @@ const selectedVisualTool = computed(() => toolOptions.value.find((tool) => tool.
function loadOptions() {
optionsLoading.value = true
return Promise.all([
ModelApi.getModelListWithShared({ model_type: 'IMAGE' }),
requestModelApi.value.getModelListWithShared({ model_type: 'IMAGE' }),
ProviderApi.getProviderList({ model_type: 'IMAGE' }),
ToolApi.getToolListWithShared(),
requestToolApi.value.getToolListWithShared(),
])
.then(([models, providers, tools]) => {
modelOptions.value = models
Expand Down
2 changes: 1 addition & 1 deletion ui/src/views/knowledge/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ function handleBatchDelete() {
<template v-if="!isShared" #action-dropdown>
<!-- 同步 -->
<SyncKnowledgeAction
v-if="knowledge.type === KNOWLEDGE_TYPE.WEB"
v-if="knowledge.type !== KNOWLEDGE_TYPE.BASE"
v-model:loading="knowledgeOperationLoading"
label="同步"
:api="KnowledgeApi"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<script setup lang="ts">
import { useRoute, useRouter } from 'vue-router'
import { KNOWLEDGE_TYPE_MAP } from '@/constants/knowledge'
import { KNOWLEDGE_TYPE_KEY, KNOWLEDGE_TYPE_MAP } from '@/constants/knowledge'
import type { KnowledgeItem } from '@/api/types'

defineOptions({ name: 'SettingKnowledgeAction' })
Expand All @@ -11,9 +11,10 @@ const router = useRouter()

function handleSettingKnowledge(event: MouseEvent) {
event.stopPropagation()
const knowledgeType = KNOWLEDGE_TYPE_MAP[props.knowledge.type]
void router.push({
name: 'workspace-knowledge-setting',
params: { workspaceId: route.params.workspaceId, knowledgeId: props.knowledge.id, type: KNOWLEDGE_TYPE_MAP[props.knowledge.type] },
name: knowledgeType === KNOWLEDGE_TYPE_KEY.BASE ? 'workspace-knowledge-setting' : 'workspace-knowledge-base-setting',
params: { workspaceId: route.params.workspaceId, knowledgeId: props.knowledge.id, type: knowledgeType },
})
}
</script>
Expand Down
Loading
Loading