diff --git a/ui/src/api/API_README.md b/ui/src/api/API_README.md index eb6b8c910ab..ef2165ab3c8 100644 --- a/ui/src/api/API_README.md +++ b/ui/src/api/API_README.md @@ -56,6 +56,7 @@ src/api/ 入口,也不创建汇总所有业务接口的 `api.ts`。 - 工具基础信息和工具工作流使用后端不同资源接口:`workspace/tool/tool.ts` 维护工具增删改查, `workspace/tool/workflow.ts` 维护工具工作流的加载、保存和发布。 + 工具工作流保存请求的 `default_model_setting` 与详情响应统一复用 `DefaultModelSettingPayload`。 - 每个业务接口函数必须添加简短的 JSDoc,说明接口的业务作用;注释应描述“获取什么”“保存什么” 或“对哪个资源执行什么操作”,不重复参数类型、请求方法等代码已经清楚表达的信息。 - 每个业务接口使用 `const` 声明的箭头函数,不单独具名导出;在文件末尾通过 @@ -225,3 +226,11 @@ API 对象和工作空间上下文,作为该抽屉的范围选择例外;用 `putBatchDeleteTrigger(ids)` 提交 `{ id_list }` 到 `batch_delete`。单项启停通过 `putTrigger` 仅提交 `is_active`。`Trigger` 为分页摘要,`TriggerDetail` 为含任务参数的完整详情; `TriggerPayload` 用于新建和编辑,ID 在新建前生成以展示事件回调 URL。 + +### 知识库工作流 + +`workspace/knowledge/knowledge.ts` 的 `getKnowledgeDetail` 返回 `KnowledgeDetail`,包含知识库 +名称、所属目录,以及工作流类型的 `work_flow` 和发布状态;进入画布只调用此详情接口加载。 +`workspace/knowledge/workflow.ts` 维护保存和发布,保存提交 `work_flow`,响应使用 +`KnowledgeWorkflowDetail`。前端详情与保存协议的 `default_model_setting` 复用 +`DefaultModelSettingPayload`;服务端需支持该字段的持久化与回传(当前仓库知识库后端尚未实现)。 diff --git a/ui/src/api/admin/workspace/knowledge/knowledge.ts b/ui/src/api/admin/workspace/knowledge/knowledge.ts index 84f3c0acea7..6ded57358e7 100644 --- a/ui/src/api/admin/workspace/knowledge/knowledge.ts +++ b/ui/src/api/admin/workspace/knowledge/knowledge.ts @@ -1,6 +1,6 @@ import { del, get, post, put } from '../../core/request' import type { ParamsPage, ResponsePage } from '../../core/types' -import type { Dict, KnowledgeItem } from '@/api/types' +import type { Dict, KnowledgeDetail, KnowledgeItem } from '@/api/types' import { getWorkspaceId } from '@/utils/resource-context' const getPrefix = () => { @@ -17,6 +17,11 @@ const getKnowledgePage = (page: ParamsPage, query?: Dict) => { return get>(`${getPrefix()}/${page.currentPage}/${page.pageSize}`, query) } +/** 获取工作空间知识库详情。 */ +const getKnowledgeDetail = (knowledgeId: string) => { + return get(`${getPrefix()}/${knowledgeId}`) +} + /** 删除工作空间知识库。 */ const deleteKnowledge = (knowledgeId: string) => { return del(`${getPrefix()}/${knowledgeId}`) @@ -50,6 +55,7 @@ const importKnowledgeBundle = (payload: FormData) => { export default { deleteKnowledge, getAllKnowledge, + getKnowledgeDetail, getKnowledgePage, putKnowledge, putLarkKnowledge, diff --git a/ui/src/api/admin/workspace/knowledge/workflow.ts b/ui/src/api/admin/workspace/knowledge/workflow.ts new file mode 100644 index 00000000000..00c81d32930 --- /dev/null +++ b/ui/src/api/admin/workspace/knowledge/workflow.ts @@ -0,0 +1,26 @@ +import type LogicFlow from '@logicflow/core' +import { put } from '../../core/request' +import type { DefaultModelSettingPayload, KnowledgeWorkflowDetail } from '@/api/types' +import { getWorkspaceId } from '@/utils/resource-context' + +interface KnowledgeWorkflowPayload { + default_model_setting?: DefaultModelSettingPayload + work_flow: LogicFlow.GraphConfigData +} + +const getPrefix = () => { + const workspaceId = getWorkspaceId() + return `/workspace/${workspaceId}/knowledge` +} + +/** 保存知识库工作流。 */ +const putKnowledgeWorkflow = (knowledgeId: string, payload: KnowledgeWorkflowPayload) => { + return put(`${getPrefix()}/${knowledgeId}/workflow`, payload) +} + +/** 发布知识库工作流。 */ +const putKnowledgeWorkflowPublish = (knowledgeId: string) => { + return put(`${getPrefix()}/${knowledgeId}/publish`) +} + +export default { putKnowledgeWorkflow, putKnowledgeWorkflowPublish } diff --git a/ui/src/api/admin/workspace/tool/workflow.ts b/ui/src/api/admin/workspace/tool/workflow.ts index c4293bcbf25..79ca5b1d83c 100644 --- a/ui/src/api/admin/workspace/tool/workflow.ts +++ b/ui/src/api/admin/workspace/tool/workflow.ts @@ -1,9 +1,10 @@ import type LogicFlow from '@logicflow/core' import { get, put } from '../../core/request' -import type { ToolWorkflowDetail } from '@/api/types' +import type { DefaultModelSettingPayload, ToolWorkflowDetail } from '@/api/types' import { getWorkspaceId } from '@/utils/resource-context' interface ToolWorkflowPayload { + default_model_setting?: DefaultModelSettingPayload work_flow: LogicFlow.GraphConfigData } diff --git a/ui/src/api/types/knowledge.ts b/ui/src/api/types/knowledge.ts index 79413f6b7b7..6628533a252 100644 --- a/ui/src/api/types/knowledge.ts +++ b/ui/src/api/types/knowledge.ts @@ -1,6 +1,8 @@ /** Workspace 知识库列表和知识库卡片共用的业务类型。 */ +import type LogicFlow from '@logicflow/core' import { KNOWLEDGE_TYPE } from '@/api/enums' +import type { DefaultModelSettingPayload } from './model' export type KnowledgeType = (typeof KNOWLEDGE_TYPE)[keyof typeof KNOWLEDGE_TYPE] @@ -26,8 +28,29 @@ export interface KnowledgeItem { workspace_id: string } +/** 知识库详情,工作流类型包含画布及发布状态。 */ +export interface KnowledgeDetail extends KnowledgeItem { + default_model_setting?: DefaultModelSettingPayload + work_flow?: LogicFlow.GraphConfigData + is_publish?: boolean + publish_time?: string | null +} + /** 按标签名称分组的知识库标签。 */ export interface KnowledgeTagGroup { key: string values: { id: string; value: string; create_time: string; update_time: string }[] } + +/** 知识库工作流详情。 */ +export interface KnowledgeWorkflowDetail { + id: string + knowledge: string + workspace_id: string + default_model_setting?: DefaultModelSettingPayload + work_flow?: LogicFlow.GraphConfigData + is_publish: boolean + publish_time?: string | null + create_time?: string + update_time?: string +} diff --git a/ui/src/assets/workflow/icon_data-source-local.svg b/ui/src/assets/workflow/icon_data-source-local.svg new file mode 100644 index 00000000000..9ec61b967c4 --- /dev/null +++ b/ui/src/assets/workflow/icon_data-source-local.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/ui/src/assets/workflow/icon_knowledge-write.svg b/ui/src/assets/workflow/icon_knowledge-write.svg new file mode 100644 index 00000000000..0111b9d18b7 --- /dev/null +++ b/ui/src/assets/workflow/icon_knowledge-write.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/ui/src/router/ROUTE_README.md b/ui/src/router/ROUTE_README.md index bbc645f4a0f..8754530a15d 100644 --- a/ui/src/router/ROUTE_README.md +++ b/ui/src/router/ROUTE_README.md @@ -67,13 +67,14 @@ System 根地址为 `/admin/system`,默认进入首页 `/admin/system/home`。 Login、Workflow 路由没有挂载 `AppLayout`,因此不会出现在左侧导航中: - `login`:登录及账户相关独立页面。 -- `workflow`:集中维护各业务的全屏画布路由,当前包含智能体和工具工作流,后续知识库等画布 +- `workflow`:集中维护各业务的全屏画布路由,当前包含智能体、工具和知识库工作流,后续其他画布 继续在 `admin/workflow/index.ts` 中注册。 - Workspace 的全屏 Workflow 路由显式设置 `resourceScope: 'workspace'`,使模型创建等资源操作使用 Workspace API。 - Workflow 路由保留当前 Workspace 和资源标识;智能体工作流地址为 `/workspace/:workspaceId/application/:applicationId/workflow`,工具工作流地址为 `/workspace/:workspaceId/tool/:toolId/workflow`。两个页面均可从资源操作入口进入,按住 Ctrl 或 - Command 点击时在新标签页打开。 + Command 点击时在新标签页打开。知识库工作流路由名为 `workflow-knowledge`,地址为 + `/workspace/:workspaceId/knowledge/:knowledgeId/workflow`。 登录页面地址为 `/login`;忘记密码使用独立页面 `/forgot-password`,两者均复用登录布局且不挂载 `AppLayout`。 @@ -200,7 +201,10 @@ Workspace 页面: /admin/workspace/:workspaceId/application/:applicationId/:type/setting /admin/workspace/:workspaceId/knowledge +/admin/workspace/:workspaceId/knowledge/:knowledgeId/workflow /admin/workspace/:workspaceId/knowledge/:knowledgeId +/admin/workspace/:workspaceId/knowledge/:knowledgeId/document +/admin/workspace/:workspaceId/knowledge/:knowledgeId/workflow-entry /admin/workspace/:workspaceId/knowledge/:knowledgeId/document/:documentId ``` @@ -309,3 +313,8 @@ System 共享资源页面: - Login、Workflow 等全屏页面不要挂载 `AppLayout`。 - Admin 与 Chat 路由不要相互引用。 - 每次新增、删除、移动或修改路由时,必须同步更新本文件。 + +工作空间知识库卡片进入 `workspace-knowledge-detail`,默认重定向到“文档”子路由。 +详情容器复用 `ResourceDetailLayout`,二级目录包含“文档”和“工作流”;`workflow-entry` +仅作为目录跳转入口,重定向到独立的 `workflow-knowledge` 全屏画布。画布返回知识库详情。 +文档详情继续保留原地址,并通过 `detailActiveMenu` 高亮“文档”。 diff --git a/ui/src/router/admin/workflow/index.ts b/ui/src/router/admin/workflow/index.ts index 9dae47a3aaa..471eb6ba3ea 100644 --- a/ui/src/router/admin/workflow/index.ts +++ b/ui/src/router/admin/workflow/index.ts @@ -14,4 +14,10 @@ export const workflowRoutes: RouteRecordRaw[] = [ component: () => import('@/views/workflow/tool/ToolWorkflowView.vue'), meta: { title: '工具工作流', resourceScope: 'workspace' }, }, + { + path: '/workspace/:workspaceId/knowledge/:knowledgeId/workflow', + name: 'workflow-knowledge', + component: () => import('@/views/workflow/knowledge/KnowledgeWorkflowView.vue'), + meta: { title: '知识库工作流', resourceScope: 'workspace' }, + }, ] diff --git a/ui/src/router/admin/workspace/modules/knowledge.ts b/ui/src/router/admin/workspace/modules/knowledge.ts index 82e06e35795..7bfac4e2761 100644 --- a/ui/src/router/admin/workspace/modules/knowledge.ts +++ b/ui/src/router/admin/workspace/modules/knowledge.ts @@ -7,18 +7,38 @@ export const knowledgeRoutes: RouteRecordRaw[] = [ redirect: { name: 'workspace-knowledge-list' }, meta: { title: '知识库', activeMenu: 'workspace-knowledge', icon: 'icon_book_outlined', activeIcon: 'icon_book_filled', order: 30 }, children: [ - { path: '', name: 'workspace-knowledge-list', component: () => import('@/views/knowledge/KnowledgeView.vue'), meta: { title: '知识库列表', hidden: true } }, + { + path: '', + name: 'workspace-knowledge-list', + component: () => import('@/views/knowledge/KnowledgeView.vue'), + meta: { title: '知识库列表', hidden: true }, + }, { path: ':knowledgeId', name: 'workspace-knowledge-detail', - component: () => import('@/views/knowledge-detail/KnowledgeDetailView.vue'), + component: () => import('@/views/knowledge-detail/WorkspaceKnowledgeDetailView.vue'), + redirect: { name: 'workspace-knowledge-document-list' }, meta: { title: '知识库详情', hidden: true }, - }, - { - path: ':knowledgeId/document/:documentId', - name: 'workspace-knowledge-document-detail', - component: () => import('@/views/knowledge-detail/DocumentDetailView.vue'), - meta: { title: '文档详情', hidden: true }, + children: [ + { + path: 'document', + name: 'workspace-knowledge-document-list', + component: () => import('@/views/knowledge-detail/document/DocumentListView.vue'), + meta: { title: '文档', order: 10 }, + }, + { + path: 'workflow-entry', + name: 'workspace-knowledge-workflow', + redirect: (to) => ({ name: 'workflow-knowledge', params: { workspaceId: to.params.workspaceId, knowledgeId: to.params.knowledgeId } }), + meta: { title: '工作流', order: 20 }, + }, + { + path: 'document/:documentId', + name: 'workspace-knowledge-document-detail', + component: () => import('@/views/knowledge-detail/DocumentDetailView.vue'), + meta: { title: '文档详情', hidden: true, detailActiveMenu: 'workspace-knowledge-document-list' }, + }, + ], }, ], }, diff --git a/ui/src/views/VIEW_README.md b/ui/src/views/VIEW_README.md index 4b94e2c7a3f..91ef764f898 100644 --- a/ui/src/views/VIEW_README.md +++ b/ui/src/views/VIEW_README.md @@ -288,6 +288,7 @@ Dialog。新增或重命名文件时,应同步更新所有导入和页面功 | `application-detail/overview/OverviewView.vue` | 智能体概览内容 | | `application-detail/setting/SimpleSettingView.vue` | 简易智能体设置内容 | | `workflow/application/ApplicationWorkflowView.vue` | 智能体工作流页面头部与全屏画布 | +| `workflow/knowledge/KnowledgeWorkflowView.vue` | 知识库工作流加载、保存、发布与全屏画布 | | `workflow/tool/ToolWorkflowView.vue` | 工具工作流页面头部与全屏画布 | | `chat/ChatView.vue` | Chat 入口的对话页面 | | `error/NotFoundView.vue` | Admin 未匹配路由和全局 404 页面 | @@ -328,7 +329,7 @@ Dialog。新增或重命名文件时,应同步更新所有导入和页面功 ## 工作流页面布局 -`workflow/components/WorkflowViewLayout.vue` 由 `ApplicationWorkflowView` 和 `ToolWorkflowView` +`workflow/components/WorkflowViewLayout.vue` 由 `ApplicationWorkflowView`、`ToolWorkflowView` 和 `KnowledgeWorkflowView` 共同使用,统一全屏容器、页面头部、返回按钮、标题和保存时间展示。通过 `loading`、`title`、 `saveTime` 传入展示状态,点击返回按钮触发 `back` 事件。 @@ -415,3 +416,15 @@ Workspace 与 System 授权均使用该工作空间 ID,不读取路由工作 共享模型不展示。页面传入完整 `RelatedResourcesApi`;Action 点击后 按需挂载 `RelatedResourcesDrawer`,以模型类型打开,在 `closed` 后卸载。 默认展示引用该模型的资源,资源名称仅展示文本,暂不支持打开目标资源。 + +知识库工作流页面使用 `WorkflowMode.Knowledge` 和 `WorkflowMode.KnowledgeLoop`,空画布使用本地文件数据源节点。 +页面只通过 `getKnowledgeDetail` 返回的 `work_flow` 加载画布数据,发布前先校验并保存;返回知识库详情时检查未保存改动。 + +`KnowledgeCard` 在非批量选择模式下通过 `click` 通知列表进入知识库详情。 +`knowledge-detail/WorkspaceKnowledgeDetailView.vue` 查询并展示知识库名称,复用 +`ResourceDetailLayout` 生成“文档”和“工作流”目录,返回列表时恢复所属文件夹。 +`knowledge-detail/document/DocumentListView.vue` 为文档列表子页面,目前保留占位内容; +文档详情作为同一容器的子路由。System 详情仍使用原有独立占位页面。 + +`KnowledgeWorkflowView` 复用 `DefaultModelSettingButton`,从知识库详情读取默认模型配置, +随工作流保存提交并将配置传入画布;支持应用到所有节点,保存失败回滚至已保存配置。 diff --git a/ui/src/views/knowledge-detail/DocumentDetailView.vue b/ui/src/views/knowledge-detail/DocumentDetailView.vue deleted file mode 100644 index 2332233a1ce..00000000000 --- a/ui/src/views/knowledge-detail/DocumentDetailView.vue +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/ui/src/views/knowledge-detail/KnowledgeDetailView.vue b/ui/src/views/knowledge-detail/KnowledgeDetailView.vue deleted file mode 100644 index 8bc23d3046f..00000000000 --- a/ui/src/views/knowledge-detail/KnowledgeDetailView.vue +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/ui/src/views/knowledge-detail/WorkspaceKnowledgeDetailView.vue b/ui/src/views/knowledge-detail/WorkspaceKnowledgeDetailView.vue new file mode 100644 index 00000000000..a2fcbbe2931 --- /dev/null +++ b/ui/src/views/knowledge-detail/WorkspaceKnowledgeDetailView.vue @@ -0,0 +1,55 @@ + + + diff --git a/ui/src/views/knowledge-detail/document/DocumentListView.vue b/ui/src/views/knowledge-detail/document/DocumentListView.vue new file mode 100644 index 00000000000..f6047a6c1b1 --- /dev/null +++ b/ui/src/views/knowledge-detail/document/DocumentListView.vue @@ -0,0 +1,7 @@ + + + diff --git a/ui/src/views/knowledge/KnowledgeView.vue b/ui/src/views/knowledge/KnowledgeView.vue index d896b13d578..a51d36cbebd 100644 --- a/ui/src/views/knowledge/KnowledgeView.vue +++ b/ui/src/views/knowledge/KnowledgeView.vue @@ -1,5 +1,6 @@