diff --git a/src/api/settings/creation/index.ts b/src/api/settings/creation/index.ts index f76b33b..27152ca 100644 --- a/src/api/settings/creation/index.ts +++ b/src/api/settings/creation/index.ts @@ -12,6 +12,19 @@ export interface NodeLibraryFormItem { type: 'input' | 'number' | 'textarea' | 'switch' | string; required: boolean; default?: string | number | boolean; + value?: unknown; + options?: Array<{ label: string; value: string | number }> | null; + expand?: NodeLibraryFormItem[] | Record | null; + fieldConstraint?: { + fileTypes?: string; + maxFileSize?: number; + maxFileCount?: number; + minLength?: number; + maxLength?: number; + numberType?: 'integer' | 'decimal' | string; + minValue?: number; + maxValue?: number; + } | null; } export interface NodeLibraryModelConfig { @@ -188,6 +201,11 @@ export interface WorkflowItem { description: string; flowContent: any; nodeInputParams?: any[]; + outputParams?: Array>; + imgAddressPrefix?: string; + fileUrls?: string[]; + resultUrl?: string; + sessionId?: string; } export interface WorkflowListResponse { @@ -313,6 +331,7 @@ export interface ExecuteFlowParams { nodeInputParams?: FlowNode[]; sessionId?: string; skillName?: string; + resultUrl?: string; } export function executeFlow(data: ExecuteFlowParams | FormData, requestOptions?: RequestOptions) { diff --git a/src/api/settings/modelConfig/modelModule/index.ts b/src/api/settings/modelConfig/modelModule/index.ts index 8c62897..89741eb 100644 --- a/src/api/settings/modelConfig/modelModule/index.ts +++ b/src/api/settings/modelConfig/modelModule/index.ts @@ -235,3 +235,13 @@ export function getIsChatModel() { method: 'get', }); } + +/** + * 获取服务商列表 + */ +export function getOperatorList() { + return request({ + url: '/model-gateway/model/listOperator', + method: 'get', + }); +} diff --git a/src/components/model/ModelSelector.vue b/src/components/model/ModelSelector.vue index 58ad932..97206fc 100644 --- a/src/components/model/ModelSelector.vue +++ b/src/components/model/ModelSelector.vue @@ -110,6 +110,9 @@ interface ModelItem { isPrivate?: number; isChatModel?: number; headMsg?: string; + operatorName?: string; + responseBody?: Record; + tokenConfig?: Record | string; form?: any; requestMapping?: any; responseMapping?: any; @@ -150,8 +153,8 @@ const modelList = ref([]); const loading = ref(false); const selectedModel = ref(null); const editModuleRef = ref(); -const isSuperAdmin = ref(false); // 鏄惁涓虹鐞嗗憳 -const modelTypes = ref>([]); // 妯″瀷绫诲瀷鍒楄〃 +const isSuperAdmin = ref(false); +const modelTypes = ref>([]); // 内置模型 API Key 配置 const apiKeyDialogVisible = ref(false); @@ -194,6 +197,15 @@ watch(visible, (val) => { } }); +watch( + () => props.modelType, + () => { + if (!visible.value) return; + pagination.pageNum = 1; + fetchModelList(); + } +); + const getModelTypeName = (type: number) => { const typeMap: Record = { 1: '推理模型', @@ -210,14 +222,13 @@ const fetchModelList = async () => { pageNum: pagination.pageNum, pageSize: pagination.pageSize, modelName: searchParams.modelName || undefined, - modelType: props.modelType, // 使用传入的 modelType + modelType: props.modelType, enabled: 1, }; const res: any = await getModelModuleList(params); modelList.value = res.data?.list || []; pagination.total = res.data?.total || 0; } catch { - // 接口错误由 request 全局提示后端 message modelList.value = []; pagination.total = 0; } finally { @@ -235,21 +246,17 @@ const handlePageChange = () => { }; const handleSelectModel = (model: ModelItem) => { - // 如果是管理员,直接选中任何模型,不需要配置 API Key if (isSuperAdmin.value) { selectedModel.value = model; return; } - // 非管理员:判断是否是内置模型(isOwner === 0 表示管理员创建的内置模型) if (model.isOwner === 0) { - // 内置模型,需要用户配置 API Key 创建副本 builtInModelToClone.value = model; apiKeyForm.modelName = model.modelName; apiKeyForm.apiKey = ''; apiKeyDialogVisible.value = true; } else { - // 用户模型,直接选中 selectedModel.value = model; } }; @@ -262,22 +269,22 @@ const handleCreatePrivateModel = async () => { creatingModel.value = true; - // 基于内置模型创建新模型(继承原模型的所有配置,只替换 apiKey) const builtInModel = builtInModelToClone.value; const createParams = { modelName: apiKeyForm.modelName, modelType: builtInModel.modelType, + operatorName: builtInModel.operatorName || '', baseUrl: builtInModel.baseUrl, httpMethod: builtInModel.httpMethod || 'POST', headMsg: builtInModel.headMsg || '', - isPrivate: builtInModel.isPrivate ?? 1, // 继承原模型的公有/私有属性 + isPrivate: builtInModel.isPrivate ?? 1, enabled: builtInModel.enabled ?? 1, isChatModel: builtInModel.isChatModel || 0, - apiKey: apiKeyForm.apiKey, // 使用用户输入的新 API Key + apiKey: apiKeyForm.apiKey, form: builtInModel.form || {}, requestMapping: builtInModel.requestMapping || {}, responseMapping: builtInModel.responseMapping || {}, - responseBody: builtInModel.responseBody || {}, // 杩斿洖涓讳綋瀛楁 + responseBody: builtInModel.responseBody || {}, maxConcurrency: builtInModel.maxConcurrency || 10, queueLimit: builtInModel.queueLimit || 100, timeoutSeconds: builtInModel.timeoutSeconds || 30, @@ -286,20 +293,15 @@ const handleCreatePrivateModel = async () => { retryQueueMaxSeconds: builtInModel.retryQueueMaxSeconds || 60, autoCleanSeconds: builtInModel.autoCleanSeconds || 300, remark: builtInModel.remark || '', - tokenMapping: builtInModel.tokenMapping || '', // Token鏄犲皠瀛楁 + tokenMapping: builtInModel.tokenMapping || '', + tokenConfig: builtInModel.tokenConfig || {}, }; const res: any = await addModelModule(createParams); - ElMessage.success('模型创建成功'); - - // 关闭对话框 apiKeyDialogVisible.value = false; - - // 刷新列表 await fetchModelList(); - // 选中新创建的模型 const newModelId = res.data?.id || res.data; if (newModelId) { const newModel = modelList.value.find((m) => m.id === String(newModelId)); @@ -338,7 +340,6 @@ const handleClose = () => { builtInModelToClone.value = null; }; -// 鍔犺浇妯″瀷绫诲瀷鍒楄〃 const loadModelTypes = async () => { try { const res: any = await getModelTypeList(); @@ -346,7 +347,7 @@ const loadModelTypes = async () => { modelTypes.value = normalizeModelTypeOptions(res); } } catch { - // 鎺ュ彛閿欒鐢?request 鍏ㄥ眬鎻愮ず鍚庣 message + // 接口错误由 request 全局提示后端 message } }; onMounted(() => { diff --git a/src/views/settings/creation/index.vue b/src/views/settings/creation/index.vue index e6a44f0..f6e693b 100644 --- a/src/views/settings/creation/index.vue +++ b/src/views/settings/creation/index.vue @@ -1,4 +1,4 @@ -