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
9 changes: 9 additions & 0 deletions ui/src/api/API_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ src/api/
入口,也不创建汇总所有业务接口的 `api.ts`。
- 工具基础信息和工具工作流使用后端不同资源接口:`workspace/tool/tool.ts` 维护工具增删改查,
`workspace/tool/workflow.ts` 维护工具工作流的加载、保存和发布。
工具工作流保存请求的 `default_model_setting` 与详情响应统一复用 `DefaultModelSettingPayload`。
- 每个业务接口函数必须添加简短的 JSDoc,说明接口的业务作用;注释应描述“获取什么”“保存什么”
或“对哪个资源执行什么操作”,不重复参数类型、请求方法等代码已经清楚表达的信息。
- 每个业务接口使用 `const` 声明的箭头函数,不单独具名导出;在文件末尾通过
Expand Down Expand Up @@ -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`;服务端需支持该字段的持久化与回传(当前仓库知识库后端尚未实现)。
8 changes: 7 additions & 1 deletion ui/src/api/admin/workspace/knowledge/knowledge.ts
Original file line number Diff line number Diff line change
@@ -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 = () => {
Expand All @@ -17,6 +17,11 @@ const getKnowledgePage = (page: ParamsPage, query?: Dict<unknown>) => {
return get<ResponsePage<KnowledgeItem>>(`${getPrefix()}/${page.currentPage}/${page.pageSize}`, query)
}

/** 获取工作空间知识库详情。 */
const getKnowledgeDetail = (knowledgeId: string) => {
return get<KnowledgeDetail>(`${getPrefix()}/${knowledgeId}`)
}

/** 删除工作空间知识库。 */
const deleteKnowledge = (knowledgeId: string) => {
return del<boolean>(`${getPrefix()}/${knowledgeId}`)
Expand Down Expand Up @@ -50,6 +55,7 @@ const importKnowledgeBundle = (payload: FormData) => {
export default {
deleteKnowledge,
getAllKnowledge,
getKnowledgeDetail,
getKnowledgePage,
putKnowledge,
putLarkKnowledge,
Expand Down
26 changes: 26 additions & 0 deletions ui/src/api/admin/workspace/knowledge/workflow.ts
Original file line number Diff line number Diff line change
@@ -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<KnowledgeWorkflowPayload, KnowledgeWorkflowDetail>(`${getPrefix()}/${knowledgeId}/workflow`, payload)
}

/** 发布知识库工作流。 */
const putKnowledgeWorkflowPublish = (knowledgeId: string) => {
return put<undefined, boolean>(`${getPrefix()}/${knowledgeId}/publish`)
}

export default { putKnowledgeWorkflow, putKnowledgeWorkflowPublish }
3 changes: 2 additions & 1 deletion ui/src/api/admin/workspace/tool/workflow.ts
Original file line number Diff line number Diff line change
@@ -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
}

Expand Down
23 changes: 23 additions & 0 deletions ui/src/api/types/knowledge.ts
Original file line number Diff line number Diff line change
@@ -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]

Expand All @@ -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
}
9 changes: 9 additions & 0 deletions ui/src/assets/workflow/icon_data-source-local.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions ui/src/assets/workflow/icon_knowledge-write.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 11 additions & 2 deletions ui/src/router/ROUTE_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`。

Expand Down Expand Up @@ -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
```

Expand Down Expand Up @@ -309,3 +313,8 @@ System 共享资源页面:
- Login、Workflow 等全屏页面不要挂载 `AppLayout`。
- Admin 与 Chat 路由不要相互引用。
- 每次新增、删除、移动或修改路由时,必须同步更新本文件。

工作空间知识库卡片进入 `workspace-knowledge-detail`,默认重定向到“文档”子路由。
详情容器复用 `ResourceDetailLayout`,二级目录包含“文档”和“工作流”;`workflow-entry`
仅作为目录跳转入口,重定向到独立的 `workflow-knowledge` 全屏画布。画布返回知识库详情。
文档详情继续保留原地址,并通过 `detailActiveMenu` 高亮“文档”。
6 changes: 6 additions & 0 deletions ui/src/router/admin/workflow/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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' },
},
]
36 changes: 28 additions & 8 deletions ui/src/router/admin/workspace/modules/knowledge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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' },
},
],
},
],
},
Expand Down
15 changes: 14 additions & 1 deletion ui/src/views/VIEW_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 页面 |
Expand Down Expand Up @@ -328,7 +329,7 @@ Dialog。新增或重命名文件时,应同步更新所有导入和页面功

## 工作流页面布局

`workflow/components/WorkflowViewLayout.vue` 由 `ApplicationWorkflowView` 和 `ToolWorkflowView`
`workflow/components/WorkflowViewLayout.vue` 由 `ApplicationWorkflowView`、`ToolWorkflowView` 和 `KnowledgeWorkflowView`
共同使用,统一全屏容器、页面头部、返回按钮、标题和保存时间展示。通过 `loading`、`title`、
`saveTime` 传入展示状态,点击返回按钮触发 `back` 事件。

Expand Down Expand Up @@ -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`,从知识库详情读取默认模型配置,
随工作流保存提交并将配置传入画布;支持应用到所有节点,保存失败回滚至已保存配置。
7 changes: 0 additions & 7 deletions ui/src/views/knowledge-detail/DocumentDetailView.vue

This file was deleted.

7 changes: 0 additions & 7 deletions ui/src/views/knowledge-detail/KnowledgeDetailView.vue

This file was deleted.

55 changes: 55 additions & 0 deletions ui/src/views/knowledge-detail/WorkspaceKnowledgeDetailView.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<script setup lang="ts">
import { computed, ref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import KnowledgeApi from '@/api/admin/workspace/knowledge/knowledge'
import type { KnowledgeItem } from '@/api/types'
import ResourceDetailLayout from '@/layout/ResourceDetailLayout.vue'

defineOptions({ name: 'WorkspaceKnowledgeDetailView' })

/* 知识库详情与目录 */
const route = useRoute()
const router = useRouter()
const knowledge = ref<KnowledgeItem>()
const loading = ref(false)
const knowledgeId = computed(() => String(route.params.knowledgeId ?? ''))
let detailRequestId = 0

function loadKnowledgeDetail() {
const requestId = ++detailRequestId
knowledge.value = undefined
loading.value = true
return KnowledgeApi.getKnowledgeDetail(knowledgeId.value)
.then((detail) => {
if (requestId === detailRequestId) knowledge.value = detail
})
.finally(() => {
if (requestId === detailRequestId) loading.value = false
})
}

function handleBack() {
void router.push({
name: 'workspace-knowledge-list',
params: { workspaceId: route.params.workspaceId },
query: knowledge.value?.folder_id ? { folderId: knowledge.value.folder_id } : {},
})
}

watch(
knowledgeId,
() => {
void loadKnowledgeDetail().catch(() => {})
},
{ immediate: true },
)
</script>

<template>
<ResourceDetailLayout :loading="loading" @back="handleBack">
<template #resource-header>
<KnowledgeIcon v-if="knowledge" :type="knowledge.type" />
<h6 class="min-w-0 truncate" :title="knowledge?.name">{{ knowledge?.name }}</h6>
</template>
</ResourceDetailLayout>
</template>
7 changes: 7 additions & 0 deletions ui/src/views/knowledge-detail/document/DocumentListView.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<script setup lang="ts">
defineOptions({ name: 'DocumentListView' })
</script>

<template>
<div class="flex min-h-0 flex-1 items-center justify-center text-N500">文档列表待接入</div>
</template>
Loading
Loading