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
50 changes: 42 additions & 8 deletions ui/src/api/API_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,18 @@ src/api/
│ ├── system/ # 系统管理业务接口
│ │ ├── chat-user/ # 对话用户、用户组及认证接口
│ │ ├── settings/ # 登录认证、邮件与外观设置接口
│ │ ├── resource-management/ # System 资源管理接口
│ │ ├── shared-resources/ # System 共享资源接口
│ │ └── <resource>.ts # 其他 System 单资源接口
│ ├── workspace/ # 工作空间业务接口
│ │ ├── conversation.ts # 调试对话、历史会话与语音接口
│ │ ├── application/ # 智能体接口
│ │ ├── knowledge/ # 知识库接口
│ │ ├── model/ # 模型接口
│ │ ├── model.ts # 模型接口
│ │ ├── trigger/ # 触发器查询及维护接口
│ │ ├── tool/ # 工具、工具工作流及工具商店接口
│ │ └── <resource>.ts # 工作空间公共资源接口
│ └── provider.ts # Workspace 与 System 共用的模型供应商接口
│ └── model-provider.ts # Workspace 与 System 共用的模型供应商接口
├── chat/ # Chat 独立请求体系
│ ├── core/request.ts # JSON 与流式请求
│ ├── core/types.ts # Chat 请求协议类型
Expand Down Expand Up @@ -136,7 +137,7 @@ v3 编辑表单提交 `{ name, description }`,标题上限 64、更新说明

### 模型选项查询

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

### System 共享工具

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

### 知识库维护

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

`admin/workspace/related-resources.ts` 维护关联资源查询:
`getResourceDependencies` 查询当前资源依赖的资源,对应后端 `mapping_resource`;
`getResourceDependents` 查询引用当前资源的资源,对应后端 `resource_mapping`。
前端按关联资源语义命名,后端接口路径保持不变。方法接收工作空间 ID、资源类型、资源 ID、`ParamsPage`
和查询参数;工作空间 ID 由目标资源数据的 `workspace_id` 显式传入,不读取路由。返回 `ResponsePage<RelatedResource>`,
`getUsingResources` 查询当前资源依赖的资源,对应后端 `mapping_resource`;
`getUsedByResources` 查询引用当前资源的资源,对应后端 `resource_mapping`。
前端按关联资源语义命名,后端接口路径保持不变。方法接收资源类型、资源 ID、`ParamsPage`
和查询参数;Workspace 接口内部通过 `getWorkspaceId()` 读取当前路由工作空间,调用方不传工作空间 ID。返回 `ResponsePage<RelatedResource>`,
不传 loading,不重复解包响应。`RelatedResource` 通过 `@/api/types` 导出,保留
`source_*`、`target_*` 字段。依赖查询按 `target_type` 筛选,被依赖查询按 `source_type`
筛选,类型数组沿用请求层的数组序列化。页面负责按资源范围传入完整 API,未推测 System 接口。
筛选,类型数组沿用请求层的数组序列化。页面负责按资源范围传入完整 API。

`system/shared-resources/related-resources.ts` 沿用 v2 `/system/shared/resource_mapping` 和
`/system/shared/mapping_resource`,方法只接收资源类型、资源 ID、分页和查询条件,不接收
`workspaceId`。工作空间筛选继续通过 `query.workspace_ids` 传入;两类 API 使用相同参数签名,抽屉直接调用页面传入的完整 API。

### 触发器维护

Expand Down Expand Up @@ -421,3 +433,25 @@ API 对象和工作空间上下文,作为该抽屉的范围选择例外;用
资源类型使用 `@/api/enums` 的 `FILE_SOURCE_TYPE` 与 `@/api/types` 的 `FileSourceType`,
包括知识库、智能体、工具、文档、对话及三种临时文件有效期。对话 Store 使用
`FILE_SOURCE_TYPE.CHAT` 调用对应 File API,对话 API 不再维护上传接口。

### System 资源管理模型与工具

`views/system/resource-management/` 页面导入的 API 对象统一使用 `System` 前缀,
例如 `SystemModelApi`、`SystemToolApi`、`SystemToolWorkflowApi`、`SystemRelatedResourcesApi`、
`SystemResourceTriggerApi`、`SystemCommonApi`、`SystemWorkspaceApi` 和 `SystemModelProviderApi`。
此处前缀用于区分页面中的 API 引用;共用供应商接口仍使用原有模块和请求地址。

`admin/system/resource-management/model.ts`、`tool/tool.ts` 沿用 v2 已有的
`/system/resource/model` 与 `/system/resource/tool`,适配 v3 请求解包与命名。
分页使用 `ParamsPage` / `ResponsePage`;模型、工具的 `workspace_name`、`resource_count` 和
更新时间维护在各自公共业务类型中。页面维护 loading,不传入请求方法。
模型选项使用 `/model/model_list` 并合并 `shared_model`、`model`;参数表单与配置更新使用
资源自身 ID。工具仅提供既有的查询、编辑、删除、导出、调试、连接测试、代码检查及 Skill 文件接口,
不声明资源管理范围不存在的创建、导入接口。

`tool/tool-workflow.ts` 独立维护 System 工具工作流详情、保存、发布、调试、版本历史和执行记录,
协议与 Workspace 工作流接口一致。`related-resources.ts` 使用
`/system/resource/resource_mapping` 与 `/system/resource/mapping_resource`,参数签名与
当前 Workspace 关联资源 API 一致。`resource-trigger.ts` 使用
`/system/resource/<sourceType>/<sourceId>/trigger`,资源上下文与触发器载荷复用公共类型。
System 接口由资源管理服务提供;本地开源后端没有对应扩展时,需要连接提供这些接口的部署。
37 changes: 37 additions & 0 deletions ui/src/api/admin/system/resource-management/model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { del, get, post, put } from '../../core/request'
import type { ParamsPage, ResponsePage } from '../../core/types'
import type { Dict, DynamicFormField, ModelItem, ModelPayload } from '@/api/types'

const prefix = '/system/resource/model'

/** 获取跨工作空间的模型分页列表。 */
const getModelPage = (page: ParamsPage, query?: Dict<unknown>) =>
get<ResponsePage<ModelItem>>(`${prefix}/${page.currentPage}/${page.pageSize}`, query)

/** 获取系统资源范围的模型及共享模型选项。 */
const getModelListWithShared = (query?: Dict<unknown>): Promise<ModelItem[]> =>
get<{ shared_model: ModelItem[]; model: ModelItem[] }>(`${prefix}/model_list`, query).then(({ shared_model, model }) => [
...shared_model.map((model): ModelItem => ({ ...model, source: 'shared' })),
...model.map((model): ModelItem => ({ ...model, source: 'workspace' })),
])

/** 获取包含认证信息的模型详情。 */
const getModelDetail = (modelId: string) => get<ModelItem>(`${prefix}/${modelId}`)

/** 创建系统资源模型。 */
const postModel = (payload: ModelPayload) => post<ModelPayload, ModelItem>(prefix, payload)

/** 更新模型配置。 */
const putModel = (modelId: string, payload: Partial<ModelPayload>) => put<Partial<ModelPayload>, ModelItem>(`${prefix}/${modelId}`, payload)

/** 删除模型。 */
const deleteModel = (modelId: string) => del<undefined, boolean>(`${prefix}/${modelId}`)

/** 获取模型参数表单。 */
const getModelParamsForm = (modelId: string) => get<DynamicFormField[]>(`${prefix}/${modelId}/model_params_form`)

/** 保存模型参数表单。 */
const putModelParamsForm = (modelId: string, payload: DynamicFormField[]) =>
put<DynamicFormField[], boolean>(`${prefix}/${modelId}/model_params_form`, payload)

export default { getModelPage, getModelListWithShared, getModelDetail, postModel, putModel, deleteModel, getModelParamsForm, putModelParamsForm }
15 changes: 15 additions & 0 deletions ui/src/api/admin/system/resource-management/related-resources.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { get } from '../../core/request'
import type { ParamsPage, ResponsePage } from '../../core/types'
import type { Dict, RelatedResource, ResourceType } from '@/api/types'

/** 获取引用当前资源的资源。 */
const getUsedByResources = (resource: ResourceType, resourceId: string, page: ParamsPage, query?: Dict<unknown>) => {
return get<ResponsePage<RelatedResource>>(`/system/resource/resource_mapping/${resource}/${resourceId}/${page.currentPage}/${page.pageSize}`, query)
}

/** 获取当前资源依赖的资源。 */
const getUsingResources = (resource: ResourceType, resourceId: string, page: ParamsPage, query?: Dict<unknown>) => {
return get<ResponsePage<RelatedResource>>(`/system/resource/mapping_resource/${resource}/${resourceId}/${page.currentPage}/${page.pageSize}`, query)
}

export default { getUsedByResources, getUsingResources }
24 changes: 24 additions & 0 deletions ui/src/api/admin/system/resource-management/resource-trigger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { get, post, put, del } from '../../core/request'
import type { ResourceTrigger, ResourceTriggerDetail, ResourceTriggerResource, TriggerPayload } from '@/api/types'

const getPrefix = (resource: ResourceTriggerResource) => `/system/resource/${resource.source_type}/${resource.source_id}/trigger`

/** 查询当前资源关联的已启用触发器。 */
const getResourceTriggerList = (resource: ResourceTriggerResource) => get<ResourceTrigger[]>(getPrefix(resource))

/** 查询触发器配置及当前资源的执行任务。 */
const getResourceTriggerDetail = (resource: ResourceTriggerResource, triggerId: string) =>
get<ResourceTriggerDetail>(`${getPrefix(resource)}/${triggerId}`)

/** 为当前资源创建只有一个执行任务的触发器。 */
const postResourceTrigger = (resource: ResourceTriggerResource, payload: TriggerPayload) =>
post<TriggerPayload, ResourceTrigger>(getPrefix(resource), payload)

/** 更新触发器配置及当前资源的任务参数,保留其他资源任务。 */
const putResourceTrigger = (resource: ResourceTriggerResource, triggerId: string, payload: TriggerPayload) =>
put<TriggerPayload, ResourceTriggerDetail>(`${getPrefix(resource)}/${triggerId}`, payload)

/** 移除当前资源与触发器的关联,最后一个任务移除时删除触发器。 */
const deleteResourceTrigger = (resource: ResourceTriggerResource, triggerId: string) => del<undefined, boolean>(`${getPrefix(resource)}/${triggerId}`)

export default { getResourceTriggerList, getResourceTriggerDetail, postResourceTrigger, putResourceTrigger, deleteResourceTrigger }
72 changes: 72 additions & 0 deletions ui/src/api/admin/system/resource-management/tool/tool-workflow.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import type LogicFlow from '@logicflow/core'
import { get, put, postStream } from '../../../core/request'
import type { ParamsPage, ResponsePage } from '../../../core/types'
import type {
DefaultModelSettingPayload,
Dict,
ToolExecutionRecord,
ToolExecutionRecordDetail,
ToolWorkflowDetail,
ToolWorkflowRecord,
WorkflowStoreTemplate,
WorkflowVersion,
WorkflowVersionPayload,
} from '@/api/types'
import { ADMIN_API_BASE_PATH } from '@/api/constants'

type ToolWorkflowPayload =
| { default_model_setting?: DefaultModelSettingPayload; work_flow: LogicFlow.GraphConfigData; work_flow_template?: never }
| { work_flow_template: WorkflowStoreTemplate; work_flow?: never }

const prefix = '/system/resource/tool'

/** 获取工具工作流详情。 */
const getToolWorkflow = (toolId: string) => {
return get<ToolWorkflowDetail>(`${prefix}/${toolId}/workflow`)
}

/** 保存工具工作流,或使用商店模板覆盖当前工作流。 */
const putToolWorkflow = (toolId: string, payload: ToolWorkflowPayload) => {
return put<ToolWorkflowPayload, ToolWorkflowDetail>(`${prefix}/${toolId}/workflow`, payload)
}

/** 发布工具工作流。 */
const putToolWorkflowPublish = (toolId: string) => {
return put<undefined, boolean>(`${prefix}/${toolId}/publish`)
}

/** 调试已保存的工具工作流,返回 SSE 响应。 */
const postToolWorkflowDebug = (toolId: string, parameters: Record<string, unknown>) =>
postStream(ADMIN_API_BASE_PATH, `${prefix}/${toolId}/debug`, parameters)

/** 查询工具工作流调试的输出和节点执行记录。 */
const getToolWorkflowRecord = (toolId: string, recordId: string) => get<ToolWorkflowRecord>(`${prefix}/${toolId}/tool_record/${recordId}`)

/** 获取工具发布历史,按发布时间倒序返回完整版本快照。 */
const getWorkflowVersions = (toolId: string) => get<WorkflowVersion[]>(`${prefix}/${toolId}/tool_version`)

/** 修改工具历史版本标题和更新说明,更新说明需要服务端支持 description 字段。 */
const putWorkflowVersion = (toolId: string, versionId: string, data: WorkflowVersionPayload) =>
put<WorkflowVersionPayload, WorkflowVersion>(`${prefix}/${toolId}/tool_version/${versionId}`, data)

/** 获取工具执行记录分页,按执行时间倒序返回。 */
const getToolExecutionRecordPage = (toolId: string, page: ParamsPage, query?: Dict<unknown>) => {
return get<ResponsePage<ToolExecutionRecord>>(`${prefix}/${toolId}/tool_record/${page.currentPage}/${page.pageSize}`, query)
}

/** 获取工具执行记录的输入输出及节点详情。 */
const getToolExecutionRecordDetail = (toolId: string, recordId: string) => {
return get<ToolExecutionRecordDetail>(`${prefix}/${toolId}/tool_record/${recordId}`)
}

export default {
getToolExecutionRecordPage,
getToolExecutionRecordDetail,
getWorkflowVersions,
putWorkflowVersion,
getToolWorkflow,
putToolWorkflow,
putToolWorkflowPublish,
postToolWorkflowDebug,
getToolWorkflowRecord,
}
70 changes: 70 additions & 0 deletions ui/src/api/admin/system/resource-management/tool/tool.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import { del, downloadRequest, getExportFile, get, post, put } from '../../../core/request'
import type { ParamsPage, ResponsePage } from '../../../core/types'
import type { Dict, ToolDebugPayload, ToolItem, ToolPayload, ToolPylintIssue } from '@/api/types'

const prefix = '/system/resource/tool'

/** 获取工具分页列表。 */
const getToolPage = (page: ParamsPage, query?: Dict<unknown>) => {
return get<ResponsePage<ToolItem>>(`${prefix}/${page.currentPage}/${page.pageSize}`, query)
}

/** 删除System 资源工具。 */
const deleteTool = (toolId: string) => {
return del<undefined, boolean>(`${prefix}/${toolId}`)
}

/** 更新System 资源工具。 */
const putTool = (toolId: string, payload: ToolPayload) => {
return put<ToolPayload, ToolItem>(`${prefix}/${toolId}`, payload)
}

/** 检查System 资源工具的 Python 代码。 */
const postToolPylint = (code: string) => {
return post<{ code: string }, ToolPylintIssue[]>(`${prefix}/pylint`, { code })
}

/** 调试普通工具代码并返回运行结果。 */
const postToolDebug = (payload: ToolDebugPayload) => {
return post<ToolDebugPayload, unknown>(`${prefix}/debug`, payload)
}

/** 获取工具详情。 */
const getToolDetail = (toolId: string) => {
return get<ToolItem>(`${prefix}/${toolId}`)
}

/** 上传 Skill 压缩包并返回临时文件 ID。 */
const putUploadSkillFile = (file: File) => {
const payload = new FormData()
payload.append('file', file)
return put<FormData, string>(`${prefix}/upload_skill_file`, payload)
}

/** 下载 Skill 工具的压缩包。 */
const downloadSkillFile = (toolId: string) => {
return downloadRequest(`${prefix}/${toolId}/download_skill_file`, 'GET')
}

/** 导出System 资源工具文件。 */
const exportTool = (toolId: string, toolName: string) => {
return getExportFile(`${toolName}.tool`, `${prefix}/${toolId}/export`)
}

/** 测试工具配置是否可连接。 */
const postToolTestConnection = (payload: ToolPayload) => {
return post<ToolPayload, boolean>(`${prefix}/test_connection`, payload)
}

export default {
getToolPage,
exportTool,
deleteTool,
getToolDetail,
downloadSkillFile,
postToolDebug,
putUploadSkillFile,
postToolPylint,
postToolTestConnection,
putTool,
}
17 changes: 17 additions & 0 deletions ui/src/api/admin/system/shared-resources/related-resources.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { get } from '../../core/request'
import type { ParamsPage, ResponsePage } from '../../core/types'
import type { Dict, RelatedResource, ResourceType } from '@/api/types'

const prefix = '/system/shared'

/** 获取引用当前资源的资源。 */
const getUsedByResources = (resource: ResourceType, resourceId: string, page: ParamsPage, query?: Dict<unknown>) => {
return get<ResponsePage<RelatedResource>>(`${prefix}/resource_mapping/${resource}/${resourceId}/${page.currentPage}/${page.pageSize}`, query)
}

/** 获取当前资源依赖的资源。 */
const getUsingResources = (resource: ResourceType, resourceId: string, page: ParamsPage, query?: Dict<unknown>) => {
return get<ResponsePage<RelatedResource>>(`${prefix}/mapping_resource/${resource}/${resourceId}/${page.currentPage}/${page.pageSize}`, query)
}

export default { getUsedByResources, getUsingResources }
Loading
Loading