Skip to content

Commit 60802b5

Browse files
feat: system resource
1 parent c7dbbf3 commit 60802b5

77 files changed

Lines changed: 1542 additions & 174 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎ui/src/api/API_README.md‎

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,18 @@ src/api/
1616
│ ├── system/ # 系统管理业务接口
1717
│ │ ├── chat-user/ # 对话用户、用户组及认证接口
1818
│ │ ├── settings/ # 登录认证、邮件与外观设置接口
19+
│ │ ├── resource-management/ # System 资源管理接口
1920
│ │ ├── shared-resources/ # System 共享资源接口
2021
│ │ └── <resource>.ts # 其他 System 单资源接口
2122
│ ├── workspace/ # 工作空间业务接口
2223
│ │ ├── conversation.ts # 调试对话、历史会话与语音接口
2324
│ │ ├── application/ # 智能体接口
2425
│ │ ├── knowledge/ # 知识库接口
25-
│ │ ├── model/ # 模型接口
26+
│ │ ├── model.ts # 模型接口
2627
│ │ ├── trigger/ # 触发器查询及维护接口
2728
│ │ ├── tool/ # 工具、工具工作流及工具商店接口
2829
│ │ └── <resource>.ts # 工作空间公共资源接口
29-
│ └── provider.ts # Workspace 与 System 共用的模型供应商接口
30+
│ └── model-provider.ts # Workspace 与 System 共用的模型供应商接口
3031
├── chat/ # Chat 独立请求体系
3132
│ ├── core/request.ts # JSON 与流式请求
3233
│ ├── core/types.ts # Chat 请求协议类型
@@ -136,7 +137,7 @@ v3 编辑表单提交 `{ name, description }`,标题上限 64、更新说明
136137

137138
### 模型选项查询
138139

139-
`workspace/model/model.ts` 的 `getModelListWithShared(query)` 请求
140+
`workspace/model.ts` 的 `getModelListWithShared(query)` 请求
140141
`/workspace/<workspaceId>/model_list`,支持 `name`、`model_type`、`model_name` 筛选。
141142
将 `shared_model` 与 `model` 按共享在前的顺序合并为 `ModelItem[]`,分别标记
142143
`source: 'shared'` 与 `source: 'workspace'`。`SelectModel` 的接口选项统一通过此方法查询,
@@ -149,6 +150,13 @@ v3 编辑表单提交 `{ name, description }`,标题上限 64、更新说明
149150
将响应的 `tools` 与 `shared_tools` 合并为 `ToolItem[]`,用于包含已授权共享工具的选项查询;
150151
按工具类型筛选时使用 `tool_type`。`workspace/shared.ts` 的 `getAllTool(query)` 仅查询共享工具。
151152

153+
### System 共享工具
154+
155+
`system/shared-resources/tool/tool.ts` 使用 `/system/shared/tool`,维护分页、详情、创建、更新、删除、
156+
导入导出、连接测试、代码检查与调试、Skill 上传下载。路径沿用 v2 System 共享工具协议。
157+
共享工具 API 不提供工作空间文件夹移动或批量接口;复用卡片、Action 和表单接收完整 Workspace
158+
与 System 共享 API 的联合类型,不补造接口以匹配 Workspace 方法集合。
159+
152160
### 知识库维护
153161

154162
`getKnowledgeMcpConfig(knowledgeId)` 与 `postKnowledgeKeywordIndex(knowledgeId)` 为预留接口方法,
@@ -301,13 +309,17 @@ API 对象和工作空间上下文,作为该抽屉的范围选择例外;用
301309
### 关联资源
302310

303311
`admin/workspace/related-resources.ts` 维护关联资源查询:
304-
`getResourceDependencies` 查询当前资源依赖的资源,对应后端 `mapping_resource`;
305-
`getResourceDependents` 查询引用当前资源的资源,对应后端 `resource_mapping`。
306-
前端按关联资源语义命名,后端接口路径保持不变。方法接收工作空间 ID、资源类型、资源 ID、`ParamsPage`
307-
和查询参数;工作空间 ID 由目标资源数据的 `workspace_id` 显式传入,不读取路由。返回 `ResponsePage<RelatedResource>`,
312+
`getUsingResources` 查询当前资源依赖的资源,对应后端 `mapping_resource`;
313+
`getUsedByResources` 查询引用当前资源的资源,对应后端 `resource_mapping`。
314+
前端按关联资源语义命名,后端接口路径保持不变。方法接收资源类型、资源 ID、`ParamsPage`
315+
和查询参数;Workspace 接口内部通过 `getWorkspaceId()` 读取当前路由工作空间,调用方不传工作空间 ID。返回 `ResponsePage<RelatedResource>`,
308316
不传 loading,不重复解包响应。`RelatedResource` 通过 `@/api/types` 导出,保留
309317
`source_*`、`target_*` 字段。依赖查询按 `target_type` 筛选,被依赖查询按 `source_type`
310-
筛选,类型数组沿用请求层的数组序列化。页面负责按资源范围传入完整 API,未推测 System 接口。
318+
筛选,类型数组沿用请求层的数组序列化。页面负责按资源范围传入完整 API。
319+
320+
`system/shared-resources/related-resources.ts` 沿用 v2 `/system/shared/resource_mapping` 和
321+
`/system/shared/mapping_resource`,方法只接收资源类型、资源 ID、分页和查询条件,不接收
322+
`workspaceId`。工作空间筛选继续通过 `query.workspace_ids` 传入;两类 API 使用相同参数签名,抽屉直接调用页面传入的完整 API。
311323

312324
### 触发器维护
313325

@@ -421,3 +433,25 @@ API 对象和工作空间上下文,作为该抽屉的范围选择例外;用
421433
资源类型使用 `@/api/enums` 的 `FILE_SOURCE_TYPE` 与 `@/api/types` 的 `FileSourceType`,
422434
包括知识库、智能体、工具、文档、对话及三种临时文件有效期。对话 Store 使用
423435
`FILE_SOURCE_TYPE.CHAT` 调用对应 File API,对话 API 不再维护上传接口。
436+
437+
### System 资源管理模型与工具
438+
439+
`views/system/resource-management/` 页面导入的 API 对象统一使用 `System` 前缀,
440+
例如 `SystemModelApi`、`SystemToolApi`、`SystemToolWorkflowApi`、`SystemRelatedResourcesApi`、
441+
`SystemResourceTriggerApi`、`SystemCommonApi`、`SystemWorkspaceApi` 和 `SystemModelProviderApi`。
442+
此处前缀用于区分页面中的 API 引用;共用供应商接口仍使用原有模块和请求地址。
443+
444+
`admin/system/resource-management/model.ts`、`tool/tool.ts` 沿用 v2 已有的
445+
`/system/resource/model` 与 `/system/resource/tool`,适配 v3 请求解包与命名。
446+
分页使用 `ParamsPage` / `ResponsePage`;模型、工具的 `workspace_name`、`resource_count` 和
447+
更新时间维护在各自公共业务类型中。页面维护 loading,不传入请求方法。
448+
模型选项使用 `/model/model_list` 并合并 `shared_model`、`model`;参数表单与配置更新使用
449+
资源自身 ID。工具仅提供既有的查询、编辑、删除、导出、调试、连接测试、代码检查及 Skill 文件接口,
450+
不声明资源管理范围不存在的创建、导入接口。
451+
452+
`tool/tool-workflow.ts` 独立维护 System 工具工作流详情、保存、发布、调试、版本历史和执行记录,
453+
协议与 Workspace 工作流接口一致。`related-resources.ts` 使用
454+
`/system/resource/resource_mapping` 与 `/system/resource/mapping_resource`,参数签名与
455+
当前 Workspace 关联资源 API 一致。`resource-trigger.ts` 使用
456+
`/system/resource/<sourceType>/<sourceId>/trigger`,资源上下文与触发器载荷复用公共类型。
457+
System 接口由资源管理服务提供;本地开源后端没有对应扩展时,需要连接提供这些接口的部署。
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { del, get, post, put } from '../../core/request'
2+
import type { ParamsPage, ResponsePage } from '../../core/types'
3+
import type { Dict, DynamicFormField, ModelItem, ModelPayload } from '@/api/types'
4+
5+
const prefix = '/system/resource/model'
6+
7+
/** 获取跨工作空间的模型分页列表。 */
8+
const getModelPage = (page: ParamsPage, query?: Dict<unknown>) =>
9+
get<ResponsePage<ModelItem>>(`${prefix}/${page.currentPage}/${page.pageSize}`, query)
10+
11+
/** 获取系统资源范围的模型及共享模型选项。 */
12+
const getModelListWithShared = (query?: Dict<unknown>): Promise<ModelItem[]> =>
13+
get<{ shared_model: ModelItem[]; model: ModelItem[] }>(`${prefix}/model_list`, query).then(({ shared_model, model }) => [
14+
...shared_model.map((model): ModelItem => ({ ...model, source: 'shared' })),
15+
...model.map((model): ModelItem => ({ ...model, source: 'workspace' })),
16+
])
17+
18+
/** 获取包含认证信息的模型详情。 */
19+
const getModelDetail = (modelId: string) => get<ModelItem>(`${prefix}/${modelId}`)
20+
21+
/** 创建系统资源模型。 */
22+
const postModel = (payload: ModelPayload) => post<ModelPayload, ModelItem>(prefix, payload)
23+
24+
/** 更新模型配置。 */
25+
const putModel = (modelId: string, payload: Partial<ModelPayload>) => put<Partial<ModelPayload>, ModelItem>(`${prefix}/${modelId}`, payload)
26+
27+
/** 删除模型。 */
28+
const deleteModel = (modelId: string) => del<undefined, boolean>(`${prefix}/${modelId}`)
29+
30+
/** 获取模型参数表单。 */
31+
const getModelParamsForm = (modelId: string) => get<DynamicFormField[]>(`${prefix}/${modelId}/model_params_form`)
32+
33+
/** 保存模型参数表单。 */
34+
const putModelParamsForm = (modelId: string, payload: DynamicFormField[]) =>
35+
put<DynamicFormField[], boolean>(`${prefix}/${modelId}/model_params_form`, payload)
36+
37+
export default { getModelPage, getModelListWithShared, getModelDetail, postModel, putModel, deleteModel, getModelParamsForm, putModelParamsForm }
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { get } from '../../core/request'
2+
import type { ParamsPage, ResponsePage } from '../../core/types'
3+
import type { Dict, RelatedResource, ResourceType } from '@/api/types'
4+
5+
/** 获取引用当前资源的资源。 */
6+
const getUsedByResources = (resource: ResourceType, resourceId: string, page: ParamsPage, query?: Dict<unknown>) => {
7+
return get<ResponsePage<RelatedResource>>(`/system/resource/resource_mapping/${resource}/${resourceId}/${page.currentPage}/${page.pageSize}`, query)
8+
}
9+
10+
/** 获取当前资源依赖的资源。 */
11+
const getUsingResources = (resource: ResourceType, resourceId: string, page: ParamsPage, query?: Dict<unknown>) => {
12+
return get<ResponsePage<RelatedResource>>(`/system/resource/mapping_resource/${resource}/${resourceId}/${page.currentPage}/${page.pageSize}`, query)
13+
}
14+
15+
export default { getUsedByResources, getUsingResources }
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { get, post, put, del } from '../../core/request'
2+
import type { ResourceTrigger, ResourceTriggerDetail, ResourceTriggerResource, TriggerPayload } from '@/api/types'
3+
4+
const getPrefix = (resource: ResourceTriggerResource) => `/system/resource/${resource.source_type}/${resource.source_id}/trigger`
5+
6+
/** 查询当前资源关联的已启用触发器。 */
7+
const getResourceTriggerList = (resource: ResourceTriggerResource) => get<ResourceTrigger[]>(getPrefix(resource))
8+
9+
/** 查询触发器配置及当前资源的执行任务。 */
10+
const getResourceTriggerDetail = (resource: ResourceTriggerResource, triggerId: string) =>
11+
get<ResourceTriggerDetail>(`${getPrefix(resource)}/${triggerId}`)
12+
13+
/** 为当前资源创建只有一个执行任务的触发器。 */
14+
const postResourceTrigger = (resource: ResourceTriggerResource, payload: TriggerPayload) =>
15+
post<TriggerPayload, ResourceTrigger>(getPrefix(resource), payload)
16+
17+
/** 更新触发器配置及当前资源的任务参数,保留其他资源任务。 */
18+
const putResourceTrigger = (resource: ResourceTriggerResource, triggerId: string, payload: TriggerPayload) =>
19+
put<TriggerPayload, ResourceTriggerDetail>(`${getPrefix(resource)}/${triggerId}`, payload)
20+
21+
/** 移除当前资源与触发器的关联,最后一个任务移除时删除触发器。 */
22+
const deleteResourceTrigger = (resource: ResourceTriggerResource, triggerId: string) => del<undefined, boolean>(`${getPrefix(resource)}/${triggerId}`)
23+
24+
export default { getResourceTriggerList, getResourceTriggerDetail, postResourceTrigger, putResourceTrigger, deleteResourceTrigger }
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import type LogicFlow from '@logicflow/core'
2+
import { get, put, postStream } from '../../../core/request'
3+
import type { ParamsPage, ResponsePage } from '../../../core/types'
4+
import type {
5+
DefaultModelSettingPayload,
6+
Dict,
7+
ToolExecutionRecord,
8+
ToolExecutionRecordDetail,
9+
ToolWorkflowDetail,
10+
ToolWorkflowRecord,
11+
WorkflowStoreTemplate,
12+
WorkflowVersion,
13+
WorkflowVersionPayload,
14+
} from '@/api/types'
15+
import { ADMIN_API_BASE_PATH } from '@/api/constants'
16+
17+
type ToolWorkflowPayload =
18+
| { default_model_setting?: DefaultModelSettingPayload; work_flow: LogicFlow.GraphConfigData; work_flow_template?: never }
19+
| { work_flow_template: WorkflowStoreTemplate; work_flow?: never }
20+
21+
const prefix = '/system/resource/tool'
22+
23+
/** 获取工具工作流详情。 */
24+
const getToolWorkflow = (toolId: string) => {
25+
return get<ToolWorkflowDetail>(`${prefix}/${toolId}/workflow`)
26+
}
27+
28+
/** 保存工具工作流,或使用商店模板覆盖当前工作流。 */
29+
const putToolWorkflow = (toolId: string, payload: ToolWorkflowPayload) => {
30+
return put<ToolWorkflowPayload, ToolWorkflowDetail>(`${prefix}/${toolId}/workflow`, payload)
31+
}
32+
33+
/** 发布工具工作流。 */
34+
const putToolWorkflowPublish = (toolId: string) => {
35+
return put<undefined, boolean>(`${prefix}/${toolId}/publish`)
36+
}
37+
38+
/** 调试已保存的工具工作流,返回 SSE 响应。 */
39+
const postToolWorkflowDebug = (toolId: string, parameters: Record<string, unknown>) =>
40+
postStream(ADMIN_API_BASE_PATH, `${prefix}/${toolId}/debug`, parameters)
41+
42+
/** 查询工具工作流调试的输出和节点执行记录。 */
43+
const getToolWorkflowRecord = (toolId: string, recordId: string) => get<ToolWorkflowRecord>(`${prefix}/${toolId}/tool_record/${recordId}`)
44+
45+
/** 获取工具发布历史,按发布时间倒序返回完整版本快照。 */
46+
const getWorkflowVersions = (toolId: string) => get<WorkflowVersion[]>(`${prefix}/${toolId}/tool_version`)
47+
48+
/** 修改工具历史版本标题和更新说明,更新说明需要服务端支持 description 字段。 */
49+
const putWorkflowVersion = (toolId: string, versionId: string, data: WorkflowVersionPayload) =>
50+
put<WorkflowVersionPayload, WorkflowVersion>(`${prefix}/${toolId}/tool_version/${versionId}`, data)
51+
52+
/** 获取工具执行记录分页,按执行时间倒序返回。 */
53+
const getToolExecutionRecordPage = (toolId: string, page: ParamsPage, query?: Dict<unknown>) => {
54+
return get<ResponsePage<ToolExecutionRecord>>(`${prefix}/${toolId}/tool_record/${page.currentPage}/${page.pageSize}`, query)
55+
}
56+
57+
/** 获取工具执行记录的输入输出及节点详情。 */
58+
const getToolExecutionRecordDetail = (toolId: string, recordId: string) => {
59+
return get<ToolExecutionRecordDetail>(`${prefix}/${toolId}/tool_record/${recordId}`)
60+
}
61+
62+
export default {
63+
getToolExecutionRecordPage,
64+
getToolExecutionRecordDetail,
65+
getWorkflowVersions,
66+
putWorkflowVersion,
67+
getToolWorkflow,
68+
putToolWorkflow,
69+
putToolWorkflowPublish,
70+
postToolWorkflowDebug,
71+
getToolWorkflowRecord,
72+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { del, downloadRequest, getExportFile, get, post, put } from '../../../core/request'
2+
import type { ParamsPage, ResponsePage } from '../../../core/types'
3+
import type { Dict, ToolDebugPayload, ToolItem, ToolPayload, ToolPylintIssue } from '@/api/types'
4+
5+
const prefix = '/system/resource/tool'
6+
7+
/** 获取工具分页列表。 */
8+
const getToolPage = (page: ParamsPage, query?: Dict<unknown>) => {
9+
return get<ResponsePage<ToolItem>>(`${prefix}/${page.currentPage}/${page.pageSize}`, query)
10+
}
11+
12+
/** 删除System 资源工具。 */
13+
const deleteTool = (toolId: string) => {
14+
return del<undefined, boolean>(`${prefix}/${toolId}`)
15+
}
16+
17+
/** 更新System 资源工具。 */
18+
const putTool = (toolId: string, payload: ToolPayload) => {
19+
return put<ToolPayload, ToolItem>(`${prefix}/${toolId}`, payload)
20+
}
21+
22+
/** 检查System 资源工具的 Python 代码。 */
23+
const postToolPylint = (code: string) => {
24+
return post<{ code: string }, ToolPylintIssue[]>(`${prefix}/pylint`, { code })
25+
}
26+
27+
/** 调试普通工具代码并返回运行结果。 */
28+
const postToolDebug = (payload: ToolDebugPayload) => {
29+
return post<ToolDebugPayload, unknown>(`${prefix}/debug`, payload)
30+
}
31+
32+
/** 获取工具详情。 */
33+
const getToolDetail = (toolId: string) => {
34+
return get<ToolItem>(`${prefix}/${toolId}`)
35+
}
36+
37+
/** 上传 Skill 压缩包并返回临时文件 ID。 */
38+
const putUploadSkillFile = (file: File) => {
39+
const payload = new FormData()
40+
payload.append('file', file)
41+
return put<FormData, string>(`${prefix}/upload_skill_file`, payload)
42+
}
43+
44+
/** 下载 Skill 工具的压缩包。 */
45+
const downloadSkillFile = (toolId: string) => {
46+
return downloadRequest(`${prefix}/${toolId}/download_skill_file`, 'GET')
47+
}
48+
49+
/** 导出System 资源工具文件。 */
50+
const exportTool = (toolId: string, toolName: string) => {
51+
return getExportFile(`${toolName}.tool`, `${prefix}/${toolId}/export`)
52+
}
53+
54+
/** 测试工具配置是否可连接。 */
55+
const postToolTestConnection = (payload: ToolPayload) => {
56+
return post<ToolPayload, boolean>(`${prefix}/test_connection`, payload)
57+
}
58+
59+
export default {
60+
getToolPage,
61+
exportTool,
62+
deleteTool,
63+
getToolDetail,
64+
downloadSkillFile,
65+
postToolDebug,
66+
putUploadSkillFile,
67+
postToolPylint,
68+
postToolTestConnection,
69+
putTool,
70+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { get } from '../../core/request'
2+
import type { ParamsPage, ResponsePage } from '../../core/types'
3+
import type { Dict, RelatedResource, ResourceType } from '@/api/types'
4+
5+
const prefix = '/system/shared'
6+
7+
/** 获取引用当前资源的资源。 */
8+
const getUsedByResources = (resource: ResourceType, resourceId: string, page: ParamsPage, query?: Dict<unknown>) => {
9+
return get<ResponsePage<RelatedResource>>(`${prefix}/resource_mapping/${resource}/${resourceId}/${page.currentPage}/${page.pageSize}`, query)
10+
}
11+
12+
/** 获取当前资源依赖的资源。 */
13+
const getUsingResources = (resource: ResourceType, resourceId: string, page: ParamsPage, query?: Dict<unknown>) => {
14+
return get<ResponsePage<RelatedResource>>(`${prefix}/mapping_resource/${resource}/${resourceId}/${page.currentPage}/${page.pageSize}`, query)
15+
}
16+
17+
export default { getUsedByResources, getUsingResources }

0 commit comments

Comments
 (0)