diff --git a/ui/src/api/API_README.md b/ui/src/api/API_README.md index c68b19cd04f..afaa658d45d 100644 --- a/ui/src/api/API_README.md +++ b/ui/src/api/API_README.md @@ -455,3 +455,10 @@ API 对象和工作空间上下文,作为该抽屉的范围选择例外;用 当前 Workspace 关联资源 API 一致。`resource-trigger.ts` 使用 `/system/resource///trigger`,资源上下文与触发器载荷复用公共类型。 System 接口由资源管理服务提供;本地开源后端没有对应扩展时,需要连接提供这些接口的部署。 + +### System 共享工具工作流 + +`system/shared-resources/tool/tool-workflow.ts` 维护共享工具的工作流详情、保存、发布、调试、 +版本和执行记录,前缀为 `/system/shared/tool`,调用只传资源 ID,不读取工作空间。 +两种 System 工具 API 的 `getToolListWithShared` 查询各自 `/tool_list` 并合并 `tools`、`shared_tools`, +供画布的工具菜单及 MCP 选项使用。系统扩展接口需连接支持相应协议的部署进行联调。 diff --git a/ui/src/api/admin/system/resource-management/tool/tool.ts b/ui/src/api/admin/system/resource-management/tool/tool.ts index c42ccd5b506..f3bad309600 100644 --- a/ui/src/api/admin/system/resource-management/tool/tool.ts +++ b/ui/src/api/admin/system/resource-management/tool/tool.ts @@ -4,6 +4,10 @@ import type { Dict, ToolDebugPayload, ToolItem, ToolPayload, ToolPylintIssue } f const prefix = '/system/resource/tool' +/** 获取当前系统范围可用的工具选项。 */ +const getToolListWithShared = (query?: Dict) => + get<{ tools: ToolItem[]; shared_tools: ToolItem[] }>(`${prefix}/tool_list`, query).then(({ tools, shared_tools }) => [...tools, ...shared_tools]) + /** 获取工具分页列表。 */ const getToolPage = (page: ParamsPage, query?: Dict) => { return get>(`${prefix}/${page.currentPage}/${page.pageSize}`, query) @@ -57,6 +61,7 @@ const postToolTestConnection = (payload: ToolPayload) => { } export default { + getToolListWithShared, getToolPage, exportTool, deleteTool, diff --git a/ui/src/api/admin/system/shared-resources/tool/tool-workflow.ts b/ui/src/api/admin/system/shared-resources/tool/tool-workflow.ts new file mode 100644 index 00000000000..6772991ac68 --- /dev/null +++ b/ui/src/api/admin/system/shared-resources/tool/tool-workflow.ts @@ -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/shared/tool' + +/** 获取工具工作流详情。 */ +const getToolWorkflow = (toolId: string) => { + return get(`${prefix}/${toolId}/workflow`) +} + +/** 保存工具工作流,或使用商店模板覆盖当前工作流。 */ +const putToolWorkflow = (toolId: string, payload: ToolWorkflowPayload) => { + return put(`${prefix}/${toolId}/workflow`, payload) +} + +/** 发布工具工作流。 */ +const putToolWorkflowPublish = (toolId: string) => { + return put(`${prefix}/${toolId}/publish`) +} + +/** 调试已保存的工具工作流,返回 SSE 响应。 */ +const postToolWorkflowDebug = (toolId: string, parameters: Record) => + postStream(ADMIN_API_BASE_PATH, `${prefix}/${toolId}/debug`, parameters) + +/** 查询工具工作流调试的输出和节点执行记录。 */ +const getToolWorkflowRecord = (toolId: string, recordId: string) => get(`${prefix}/${toolId}/tool_record/${recordId}`) + +/** 获取工具发布历史,按发布时间倒序返回完整版本快照。 */ +const getWorkflowVersions = (toolId: string) => get(`${prefix}/${toolId}/tool_version`) + +/** 修改工具历史版本标题和更新说明,更新说明需要服务端支持 description 字段。 */ +const putWorkflowVersion = (toolId: string, versionId: string, data: WorkflowVersionPayload) => + put(`${prefix}/${toolId}/tool_version/${versionId}`, data) + +/** 获取工具执行记录分页,按执行时间倒序返回。 */ +const getToolExecutionRecordPage = (toolId: string, page: ParamsPage, query?: Dict) => { + return get>(`${prefix}/${toolId}/tool_record/${page.currentPage}/${page.pageSize}`, query) +} + +/** 获取工具执行记录的输入输出及节点详情。 */ +const getToolExecutionRecordDetail = (toolId: string, recordId: string) => { + return get(`${prefix}/${toolId}/tool_record/${recordId}`) +} + +export default { + getToolExecutionRecordPage, + getToolExecutionRecordDetail, + getWorkflowVersions, + putWorkflowVersion, + getToolWorkflow, + putToolWorkflow, + putToolWorkflowPublish, + postToolWorkflowDebug, + getToolWorkflowRecord, +} diff --git a/ui/src/api/admin/system/shared-resources/tool/tool.ts b/ui/src/api/admin/system/shared-resources/tool/tool.ts index d5ba7a771ef..9a2df1f3e1a 100644 --- a/ui/src/api/admin/system/shared-resources/tool/tool.ts +++ b/ui/src/api/admin/system/shared-resources/tool/tool.ts @@ -4,6 +4,10 @@ import type { Dict, ToolDebugPayload, ToolItem, ToolPayload, ToolPylintIssue } f const prefix = '/system/shared/tool' +/** 获取当前系统范围可用的工具选项。 */ +const getToolListWithShared = (query?: Dict) => + get<{ tools: ToolItem[]; shared_tools: ToolItem[] }>(`${prefix}/tool_list`, query).then(({ tools, shared_tools }) => [...tools, ...shared_tools]) + /** 获取工具分页列表。 */ const getToolPage = (page: ParamsPage, query?: Dict) => { return get>(`${prefix}/${page.currentPage}/${page.pageSize}`, query) @@ -70,6 +74,7 @@ const postToolTestConnection = (payload: ToolPayload) => { } export default { + getToolListWithShared, getToolPage, exportTool, deleteTool, diff --git a/ui/src/components.d.ts b/ui/src/components.d.ts index 11245b90f1c..1fbe897fb39 100644 --- a/ui/src/components.d.ts +++ b/ui/src/components.d.ts @@ -42,7 +42,7 @@ declare module 'vue' { MkTable: typeof import('./components/global/mk-table/index.vue')['default'] MkTableFilter: typeof import('./components/global/mk-table/MkTableFilter.vue')['default'] MkTableMoreDropdown: typeof import('./components/global/mk-table/MkTableMoreDropdown.vue')['default'] - MkTableOperationGroup: typeof import('./components/global/mk-table/MkTableOperationGroup.vue')['default'] + MkTableOperationGroup: typeof import('./components/global/mk-action/MkTableOperationGroup.vue')['default'] MkTagGroup: typeof import('./components/global/mk-tag-group/index.vue')['default'] MkTooltip: typeof import('./components/global/mk-tooltip/index.vue')['default'] MkViewLayout: typeof import('./components/global/mk-view-layout/index.vue')['default'] @@ -86,7 +86,7 @@ declare global { const MkTable: typeof import('./components/global/mk-table/index.vue')['default'] const MkTableFilter: typeof import('./components/global/mk-table/MkTableFilter.vue')['default'] const MkTableMoreDropdown: typeof import('./components/global/mk-table/MkTableMoreDropdown.vue')['default'] - const MkTableOperationGroup: typeof import('./components/global/mk-table/MkTableOperationGroup.vue')['default'] + const MkTableOperationGroup: typeof import('./components/global/mk-action/MkTableOperationGroup.vue')['default'] const MkTagGroup: typeof import('./components/global/mk-tag-group/index.vue')['default'] const MkTooltip: typeof import('./components/global/mk-tooltip/index.vue')['default'] const MkViewLayout: typeof import('./components/global/mk-view-layout/index.vue')['default'] diff --git a/ui/src/components/COMPONENT_README.md b/ui/src/components/COMPONENT_README.md index eb764b71b40..550f6611ac9 100644 --- a/ui/src/components/COMPONENT_README.md +++ b/ui/src/components/COMPONENT_README.md @@ -295,6 +295,7 @@ Dialog、Drawer、Popover、嵌套区域等其他大、小表格均禁止开启 ### MkTableOperationGroup、MkAction +`MkTableOperationGroup` 与 `MkAction`、`context.ts` 统一维护在 `global/mk-action/`。 表格操作列使用 `MkTableOperationGroup` 默认插槽声明操作,按模板顺序将前 `maxVisible` 个操作 (默认 2)显示为图标按钮,其余自动进入 More;没有剩余操作时不显示 More。 每个直接子组件代表一个操作,业务 Action 内使用 `MkAction` 作为展示入口。 diff --git a/ui/src/components/global/mk-table/MkTableOperationGroup.vue b/ui/src/components/global/mk-action/MkTableOperationGroup.vue similarity index 94% rename from ui/src/components/global/mk-table/MkTableOperationGroup.vue rename to ui/src/components/global/mk-action/MkTableOperationGroup.vue index 850f084e332..34b8dd2bc15 100644 --- a/ui/src/components/global/mk-table/MkTableOperationGroup.vue +++ b/ui/src/components/global/mk-action/MkTableOperationGroup.vue @@ -1,7 +1,7 @@