From 3b71f144c4dab11d09fee0f3245888ea61d98838 Mon Sep 17 00:00:00 2001 From: 2910410219 <2910410219@qq.com> Date: Sat, 15 Aug 2026 10:43:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A8=A1=E5=9E=8B=E7=AE=A1?= =?UTF-8?q?=E7=90=86v2=E5=AF=B9=E8=AF=9D=E6=A8=A1=E5=9E=8B=E5=9B=9E?= =?UTF-8?q?=E6=98=BE=E4=B8=8E=E5=BC=82=E6=AD=A5=E5=BC=B9=E7=AA=97=E5=B4=A9?= =?UTF-8?q?=E6=BA=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复 chatModel 开关回显:字段大小写与后端对齐(chatModel) - 修复异步模型 asyncTaskMapping 内字段为 null 时编辑弹窗崩溃 - lastFrame 提交仅限视频模型,避免占位符误提交 - 切换返回类型时清空 responseBodyMapping 残留 - 列表页访问类型列改为供应商列(后端不再返回 PrivateModel) - ModelManageItem 类型与后端返回字段对齐(modelSupplier/chatModel/minDuration 等) --- src/api/settings/modelConfigV2/index.ts | 7 ++++-- .../modelConfigV2/component/editModule.vue | 16 +++++++++---- src/views/settings/modelConfigV2/index.vue | 24 ++++++++++++++++--- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/api/settings/modelConfigV2/index.ts b/src/api/settings/modelConfigV2/index.ts index df597af..40f5250 100644 --- a/src/api/settings/modelConfigV2/index.ts +++ b/src/api/settings/modelConfigV2/index.ts @@ -40,21 +40,24 @@ export interface ModelManageItem { updater: string; updatedAt: string; deletedAt: null | string; - modelSupplier: string; + modelSupplier: number; modelName: string; modelType: number; baseUrl: string; responseType: number; apiKey: string; enabled: boolean; - ChatModel: boolean; + chatModel?: boolean; maxConcurrency: number; maxTokens: number; tokenPredictPrice: number; requestHeadMapping: Record; requestBodyMapping: Record; + requestBusinessFieldMapping?: Record; responseMapping: Record; responseBodyMapping: Record; + responseBusinessFieldMapping?: Record; + minDuration?: number; tokenMapping?: TokenMapping; asyncTaskMapping?: AsyncTaskMapping; lastFrame?: string; diff --git a/src/views/settings/modelConfigV2/component/editModule.vue b/src/views/settings/modelConfigV2/component/editModule.vue index b1d0a88..66d4e8c 100644 --- a/src/views/settings/modelConfigV2/component/editModule.vue +++ b/src/views/settings/modelConfigV2/component/editModule.vue @@ -155,7 +155,7 @@ - 配置 ({{ Object.keys(formData.asyncTaskMapping.responseMapping).length }}) + 配置 ({{ Object.keys((formData.asyncTaskMapping.responseMapping || {})).length }}) @@ -529,6 +529,7 @@ const hasTaskStatusConfig = computed(() => taskStatusOptions.value.length > 0); /** 用户手动切换返回类型时清空 token 映射(编程赋值不触发) */ function handleResponseTypeChange() { formData.tokenMapping = { ...defaultTokenMapping }; + formData.responseBodyMapping = []; } @@ -661,7 +662,7 @@ const openDialog = async (type: 'add' | 'edit', id?: string) => { formData.apiKey = row.apiKey || ''; formData.responseType = row.responseType ?? row.invokeType; formData.enabled = row.enabled ?? true; - formData.chatModel = row.ChatModel ?? false; + formData.chatModel = row.chatModel ?? row.ChatModel ?? false; formData.maxConcurrency = row.maxConcurrency || 10; formData.maxTokens = row.maxTokens || 4096; formData.tokenPredictPrice = row.tokenPredictPrice ?? 0; @@ -672,7 +673,14 @@ const openDialog = async (type: 'add' | 'edit', id?: string) => { ? (Array.isArray(row.responseBodyMapping) ? row.responseBodyMapping : Object.keys(row.responseBodyMapping)) : []; formData.tokenMapping = row.tokenMapping ? { ...defaultTokenMapping, ...row.tokenMapping } : { ...defaultTokenMapping }; - formData.asyncTaskMapping = row.asyncTaskMapping ? { ...defaultAsyncTaskMapping, ...row.asyncTaskMapping } : { ...defaultAsyncTaskMapping }; + formData.asyncTaskMapping = row.asyncTaskMapping + ? { + ...defaultAsyncTaskMapping, + ...row.asyncTaskMapping, + requestHeadMapping: row.asyncTaskMapping.requestHeadMapping || {}, + responseMapping: row.asyncTaskMapping.responseMapping || {}, + } + : { ...defaultAsyncTaskMapping }; formData.lastFrame = row.lastFrame || ''; formData.maxDuration = row.maxDuration ?? 0; formData.tokenPredictPriceUnit = row.tokenPredictPriceUnit || ''; @@ -730,7 +738,7 @@ const handleSubmit = async () => { asyncTaskMapping = hasAsyncConfig ? ({ ...atm } as AsyncTaskMapping) : undefined; } - if (formData.lastFrame) { + if (isVideoModel.value && formData.lastFrame) { lastFrame = formData.lastFrame; } let maxDuration: number | undefined; diff --git a/src/views/settings/modelConfigV2/index.vue b/src/views/settings/modelConfigV2/index.vue index 64fad75..9c0d3fc 100644 --- a/src/views/settings/modelConfigV2/index.vue +++ b/src/views/settings/modelConfigV2/index.vue @@ -43,9 +43,9 @@ {{ scope.row.systemModel ? '系统' : '用户' }} - + @@ -85,7 +85,7 @@ import { ref, reactive, onMounted } from 'vue'; import { ElMessage, ElMessageBox } from 'element-plus'; import { Search, Plus } from '@element-plus/icons-vue'; import EditModule from './component/editModule.vue'; -import { listModelManage, getModelManageTypes, deleteModelManage, type ModelManageItem, type ModelTypeTreeNode } from '/@/api/settings/modelConfigV2'; +import { listModelManage, getModelManageTypes, deleteModelManage, getModelSupplierList, type ModelManageItem, type ModelTypeTreeNode, type ModelSupplierItem } from '/@/api/settings/modelConfigV2'; const searchParams = reactive({ modelName: '', @@ -101,6 +101,7 @@ const pagination = reactive({ const modelList = ref([]); const loading = ref(false); const modelTypes = ref([]); +const supplierList = ref([]); const editModuleRef = ref(); /** 级联选择器的选中路径(例:[200, 201]) */ @@ -139,6 +140,22 @@ const loadModelTypes = async () => { } }; +/** 加载模型供应商列表 */ +const loadSupplierList = async () => { + try { + const res = await getModelSupplierList(); + supplierList.value = res.data?.list || []; + } catch { + supplierList.value = []; + } +}; + +/** 根据供应商值显示名称 */ +const resolveSupplierLabel = (supplier: number | undefined | null): string => { + if (supplier === undefined || supplier === null) return '—'; + return supplierList.value.find((s) => s.value === supplier)?.label ?? String(supplier); +}; + /** 获取模型列表 */ const fetchModelList = async () => { loading.value = true; @@ -204,6 +221,7 @@ const handleDelete = (row: ModelManageItem) => { onMounted(async () => { await loadModelTypes(); + loadSupplierList(); fetchModelList(); });