From 93749d7838123d261d124dedeb78633d883f17c8 Mon Sep 17 00:00:00 2001 From: wangdan-fit2cloud Date: Mon, 14 Sep 2026 10:58:35 +0800 Subject: [PATCH] feat: select model list --- ui/src/api/API_README.md | 16 ++ .../admin/workspace/knowledge/knowledge.ts | 20 +- .../api/admin/workspace/knowledge/workflow.ts | 10 +- ui/src/api/admin/workspace/model/model.ts | 23 +- ui/src/api/types/knowledge.ts | 28 ++ ui/src/components/COMPONENT_README.md | 6 + ui/src/components/mk-dynamics-form/Demo.vue | 30 +- .../constructor/items/ModelConstructor.vue | 9 +- ui/src/views/VIEW_README.md | 19 ++ ui/src/views/knowledge/KnowledgeView.vue | 23 +- .../create-knowledge/BaseKnowledgeDialog.vue | 76 +++++ .../CreateKnowledgeDropdown.vue | 102 +++++++ .../CreateWorkflowKnowledgeDialog.vue | 109 -------- .../create-knowledge/LarkKnowledgeDialog.vue | 112 ++++++++ .../create-knowledge/WebKnowledgeDialog.vue | 110 ++++++++ .../WorkflowKnowledgeDialog.vue | 84 ++++++ .../components/KnowledgeBaseForm.vue | 81 ++++++ ui/src/views/knowledge/template.ts | 259 ------------------ .../model/create-model/CreateModelDrawer.vue | 5 +- .../model/create-model/ModelCreateButton.vue | 7 +- ui/src/views/model/model-card/ModelCard.vue | 3 +- .../model/model-card/ModelDownloadStatus.vue | 3 +- .../action-dropdown/DeleteModelAction.vue | 3 +- .../edit-model-action/EditModelAction.vue | 3 +- .../edit-model-action/EditModelDrawer.vue | 8 +- .../ParamSettingAction.vue | 3 +- .../ParamSettingDrawer.vue | 3 +- .../trigger-form/TriggerFormDrawer.vue | 2 +- .../DefaultModelSettingDrawer.vue | 2 +- ui/src/workflow-canvas/WORKFLOW_README.md | 5 +- .../nodes/ai-chat-node/index.vue | 2 +- .../workflow-canvas/nodes/base-node/index.vue | 8 +- .../workflow-canvas/nodes/form-node/index.vue | 2 +- .../nodes/image-generate-node/index.vue | 2 +- .../nodes/image-to-video-node/index.vue | 2 +- .../nodes/image-understand-node/index.vue | 2 +- .../nodes/intent-node/index.vue | 2 +- .../nodes/loop-body-node/index.vue | 5 +- .../nodes/parameter-extraction-node/index.vue | 2 +- .../nodes/question-node/index.vue | 2 +- .../nodes/reranker-node/index.vue | 2 +- .../nodes/speech-to-text-node/index.vue | 2 +- .../nodes/text-to-speech-node/index.vue | 2 +- .../nodes/text-to-video-node/index.vue | 2 +- .../nodes/video-understand-node/index.vue | 2 +- .../store/api/system-resource/index.ts | 2 +- .../store/api/workspace/index.ts | 2 +- ui/src/workflow-canvas/store/index.ts | 8 +- 48 files changed, 765 insertions(+), 450 deletions(-) create mode 100644 ui/src/views/knowledge/create-knowledge/BaseKnowledgeDialog.vue create mode 100644 ui/src/views/knowledge/create-knowledge/CreateKnowledgeDropdown.vue delete mode 100644 ui/src/views/knowledge/create-knowledge/CreateWorkflowKnowledgeDialog.vue create mode 100644 ui/src/views/knowledge/create-knowledge/LarkKnowledgeDialog.vue create mode 100644 ui/src/views/knowledge/create-knowledge/WebKnowledgeDialog.vue create mode 100644 ui/src/views/knowledge/create-knowledge/WorkflowKnowledgeDialog.vue create mode 100644 ui/src/views/knowledge/create-knowledge/components/KnowledgeBaseForm.vue diff --git a/ui/src/api/API_README.md b/ui/src/api/API_README.md index 281dec65a59..13fa7572082 100644 --- a/ui/src/api/API_README.md +++ b/ui/src/api/API_README.md @@ -91,8 +91,18 @@ System 接口地址。 页面根据路由 `resourceScope` 选择当前范围的完整业务 API 对象,并将其传给需要请求的 Card Action、Drawer 或 Dialog。复用方直接使用 `typeof XxxApi` 约束完整 API 对象;不要为每组 Action 额外维护逐方法接口,例如 `ModelActionApi`,也不要使用不断扩展的 `Pick`。 +完整 API 对象的方法集合不同时,共用组件使用完整对象类型的联合,例如 +`typeof ModelApi | typeof SystemSharedModelApi`,不为凑齐类型添加其他范围不存在的接口。 仅展示数据的组件不接收 API。 +### 模型选项查询 + +`workspace/model/model.ts` 的 `getModelListWithShared(query)` 请求 +`/workspace//model_list`,支持 `name`、`model_type`、`model_name` 筛选。 +将 `shared_model` 与 `model` 按共享在前的顺序合并为 `ModelItem[]`,分别标记 +`source: 'shared'` 与 `source: 'workspace'`。`SelectModel` 的接口选项统一通过此方法查询, +工作流通过 Store 同名方法使用缓存或强制刷新。模型管理列表继续使用 `getModelList`。 + ### 工具列表查询 `workspace/tool/tool.ts` 的 `getAllTool(query)` 查询支持 `folder_id` 筛选的工作空间工具 @@ -111,6 +121,12 @@ Action、Drawer 或 Dialog。复用方直接使用 `typeof XxxApi` 约束完整 组装为 `{ id_list, folder_id }`,`putBatchDeleteKnowledge` 将 ID 数组组装为 `{ id_list }`, 分别使用 PUT 请求 `batch_move` 和 `batch_delete`。页面和 Action 负责类型判断及 loading。 +知识库创建通过 `postKnowledge`、`postWebKnowledge` 分别提交到 `/base`、`/web`; +`postLarkKnowledge` 沿用飞书扩展接口 `/lark/save`,当前开源后端未包含该实现。 +基础创建字段由 `KnowledgeCreatePayload` 统一维护,Web、飞书请求扩展对应类型;工作流创建 +复用基础字段并附加 `work_flow` 及可选的 `KnowledgeWorkflowTemplate` 商店模板。 +成功后的用户资料刷新、列表刷新和路由跳转由创建弹窗负责。 + ## 枚举与类型组织 API 枚举与类型统一在 `src/api` 范围内管理,相关规则由本文档统一维护。 diff --git a/ui/src/api/admin/workspace/knowledge/knowledge.ts b/ui/src/api/admin/workspace/knowledge/knowledge.ts index 6ded57358e7..22f0af20fc4 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, KnowledgeDetail, KnowledgeItem } from '@/api/types' +import type { Dict, KnowledgeDetail, KnowledgeItem, KnowledgeCreatePayload, WebKnowledgeCreatePayload, LarkKnowledgeCreatePayload } from '@/api/types' import { getWorkspaceId } from '@/utils/resource-context' const getPrefix = () => { @@ -22,6 +22,21 @@ const getKnowledgeDetail = (knowledgeId: string) => { return get(`${getPrefix()}/${knowledgeId}`) } +/** 创建通用知识库。 */ +const postKnowledge = (payload: KnowledgeCreatePayload) => { + return post(`${getPrefix()}/base`, payload) +} + +/** 创建 Web 知识库。 */ +const postWebKnowledge = (payload: WebKnowledgeCreatePayload) => { + return post(`${getPrefix()}/web`, payload) +} + +/** 创建飞书知识库,沿用飞书扩展接口。 */ +const postLarkKnowledge = (payload: LarkKnowledgeCreatePayload) => { + return post(`${getPrefix()}/lark/save`, payload) +} + /** 删除工作空间知识库。 */ const deleteKnowledge = (knowledgeId: string) => { return del(`${getPrefix()}/${knowledgeId}`) @@ -53,6 +68,9 @@ const importKnowledgeBundle = (payload: FormData) => { } export default { + postKnowledge, + postWebKnowledge, + postLarkKnowledge, deleteKnowledge, getAllKnowledge, getKnowledgeDetail, diff --git a/ui/src/api/admin/workspace/knowledge/workflow.ts b/ui/src/api/admin/workspace/knowledge/workflow.ts index cead35d652a..bf0544223c3 100644 --- a/ui/src/api/admin/workspace/knowledge/workflow.ts +++ b/ui/src/api/admin/workspace/knowledge/workflow.ts @@ -5,7 +5,8 @@ import type { DefaultModelSettingPayload, Dict, KnowledgeItem, - KnowledgeType, + KnowledgeCreatePayload, + KnowledgeWorkflowTemplate, KnowledgeWorkflowAction, KnowledgeWorkflowDebugPayload, KnowledgeWorkflowDetail, @@ -17,12 +18,9 @@ interface KnowledgeWorkflowPayload { work_flow: LogicFlow.GraphConfigData } -interface CreateKnowledgeWorkflowPayload { - name: string - desc?: string - folder_id: string - type: KnowledgeType +interface CreateKnowledgeWorkflowPayload extends KnowledgeCreatePayload { work_flow: LogicFlow.GraphConfigData + work_flow_template?: KnowledgeWorkflowTemplate } const getPrefix = () => { diff --git a/ui/src/api/admin/workspace/model/model.ts b/ui/src/api/admin/workspace/model/model.ts index abd678157aa..99150fda632 100644 --- a/ui/src/api/admin/workspace/model/model.ts +++ b/ui/src/api/admin/workspace/model/model.ts @@ -12,6 +12,16 @@ const getModelList = (query?: Dict) => { return get(getPrefix(), query) } +/** 获取包含已授权共享模型的下拉选项。 */ +const getModelListWithShared = (query?: Dict): Promise => { + return get<{ shared_model: ModelItem[]; model: ModelItem[] }>(`/workspace/${getWorkspaceId()}/model_list`, query).then( + ({ shared_model, model }) => [ + ...shared_model.map((model): ModelItem => ({ ...model, source: 'shared' })), + ...model.map((model): ModelItem => ({ ...model, source: 'workspace' })), + ], + ) +} + /** 创建工作空间模型。 */ const postModel = (payload: ModelPayload) => { return post(getPrefix(), payload) @@ -52,4 +62,15 @@ const putPauseModelDownload = (modelId: string) => { return put(`${getPrefix()}/${modelId}/pause_download`) } -export default { deleteModel, getModelDetail, getModelList, getModelMeta, getModelParamsForm, postModel, putModel, putModelParamsForm, putPauseModelDownload } +export default { + deleteModel, + getModelDetail, + getModelList, + getModelListWithShared, + getModelMeta, + getModelParamsForm, + postModel, + putModel, + putModelParamsForm, + putPauseModelDownload, +} diff --git a/ui/src/api/types/knowledge.ts b/ui/src/api/types/knowledge.ts index ca8bf55ff93..bddbac94c9f 100644 --- a/ui/src/api/types/knowledge.ts +++ b/ui/src/api/types/knowledge.ts @@ -72,3 +72,31 @@ export interface KnowledgeWorkflowDetail { create_time?: string update_time?: string } + +/** 创建知识库共用的基本信息。 */ +export interface KnowledgeCreatePayload { + name: string + desc: string + embedding_model_id: string + folder_id: string + type: KnowledgeType +} + +/** 创建 Web 知识库的站点配置。 */ +export interface WebKnowledgeCreatePayload extends KnowledgeCreatePayload { + source_url: string + selector: string +} + +/** 创建飞书知识库的应用配置。 */ +export interface LarkKnowledgeCreatePayload extends KnowledgeCreatePayload { + app_id: string + app_secret: string + folder_token: string +} + +/** 知识库工作流商店模板。 */ +export interface KnowledgeWorkflowTemplate { + downloadUrl: string + downloadCallbackUrl?: string +} diff --git a/ui/src/components/COMPONENT_README.md b/ui/src/components/COMPONENT_README.md index dd7e2d2b8b2..08ba00338d8 100644 --- a/ui/src/components/COMPONENT_README.md +++ b/ui/src/components/COMPONENT_README.md @@ -458,6 +458,10 @@ Knowledge 配置器复用 `SelectKnowledgeDialog` 选择可选知识库,沿用 相同 Embedding 模型约束。打开时传入已选快照,确认后回写可选知识库并清理已取消 ID 对应的 默认值;取消不修改配置。 +Model 配置器通过 `getSelectModelList(query)` 注入加载可选模型,返回 `Promise`。 +上层提供 `ModelApi.getModelListWithShared` 或工作流的 `store.force.getModelListWithShared`; +循环体转发同名注入。该名称用于数据加载能力,与业务 API 方法名区分。 + Model 配置器的默认模型也使用 `SelectModel`,仅展示已选的可选模型,不开启参数设置入口。 选择时将模型 ID 转换为包含已配置参数的 `default_value` 对象,清空时重置为空对象。 @@ -521,6 +525,8 @@ Skills 场景传入 `[TOOL_TYPE.SKILL]`,并通过 `title` 指定标题。两 按供应商分组展示模型,单选 `v-model` 为字符串,`multiple` 模式为字符串数组,变化时触发 `change`。`options` 为 `ModelItem[]`,`providerOptions` 为 `ModelProviderItem[]`,模型列表和供应商列表均由使用方查询。 +需要接口加载的模型选项统一使用 `getModelListWithShared`,共享标签读取 `source: 'shared'`。 +动态表单运行时的配置快照及默认模型的已选子集继续由上层提供,不额外查询全量模型。 只有 `status === MODEL_STATUS.SUCCESS` 的选项可选,同供应商内可用模型排在前面。 `canEditParams` 默认 `false`,开启且为单选时显示参数按钮;多选不加载或修改参数。 diff --git a/ui/src/components/mk-dynamics-form/Demo.vue b/ui/src/components/mk-dynamics-form/Demo.vue index cf063eda182..9123a3913d6 100644 --- a/ui/src/components/mk-dynamics-form/Demo.vue +++ b/ui/src/components/mk-dynamics-form/Demo.vue @@ -2,12 +2,19 @@ import { ref, computed, provide } from 'vue' import { ElMessage } from 'element-plus' import type { Dict } from '@/api/types' -import { dynamicFormTypeOptions, MkDynamicsForm, MkDynamicsFormConstructor, type DynamicFormValue, type FormField, type VisibilityFieldOption } from '@/components/mk-dynamics-form' -import modelAPI from '@/api/admin/workspace/model/model' +import { + dynamicFormTypeOptions, + MkDynamicsForm, + MkDynamicsFormConstructor, + type DynamicFormValue, + type FormField, + type VisibilityFieldOption, +} from '@/components/mk-dynamics-form' +import ModelApi from '@/api/admin/workspace/model/model' defineOptions({ name: 'MkDynamicsFormDemo' }) -provide('getSelectModelList', modelAPI.getModelList) -provide('getModelParamsForm', modelAPI.getModelParamsForm) +provide('getSelectModelList', ModelApi.getModelListWithShared) +provide('getModelParamsForm', ModelApi.getModelParamsForm) const constructorRef = ref>() const dynamicsFormRef = ref>() @@ -26,7 +33,13 @@ const visibilityFieldOptions = computed(() => [ self: true, children: formFieldList.value .filter((_, index) => index !== editIndex.value) // 排除正在编辑的字段,避免自引用 - .map((item) => ({ label: getFieldLabel(item), value: item.field, input_type: item.input_type, option_list: item.option_list, attrs: item.attrs })), + .map((item) => ({ + label: getFieldLabel(item), + value: item.field, + input_type: item.input_type, + option_list: item.option_list, + attrs: item.attrs, + })), }, ]) @@ -162,12 +175,7 @@ const validateForm = async () => { - +