diff --git a/src/apis/paths/mcp.ts b/src/apis/paths/mcp.ts index 3d95daa3aa78bb88082dc5a42279cdec0c57e3f6..31ec1eb56c97ad0331a06ccb4762bd0762ecdc04 100644 --- a/src/apis/paths/mcp.ts +++ b/src/apis/paths/mcp.ts @@ -72,7 +72,10 @@ const createOrUpdateMcpService = (params: { config: string; mcpType: 'stdio' | 'sse' | 'stream'; }) => { - return post(`${MCP_BASE_URL}`, params); + return post<{ + service_id: string; + name: string; + }>(`${MCP_BASE_URL}`, params); }; const deleteMcpService = (id: string) => { @@ -83,10 +86,9 @@ const activeMcpService = (id: string, active: boolean) => { return post<{ serviceId: string }>(`${MCP_BASE_URL}/${id}`, { active }); }; -// 定义一个名为uploadMcpIcon的函数,接收两个参数id和active +// 定义一个名为uploadMcpIcon的函数,接收两个参数serviceId和icon const uploadMcpIcon = (params: { - service_id: string; - edit: boolean; + serviceId: string; icon: File; }) => { console.log('uploadMcpIcon', params.icon); @@ -97,8 +99,7 @@ const uploadMcpIcon = (params: { `${MCP_BASE_URL}`, formData, { - service_id: params.service_id, - edit: params.edit, + serviceId: params.serviceId, }, { 'Content-Type': 'multipart/form-data' }, ); @@ -110,5 +111,5 @@ export const mcpApi = { createOrUpdateMcpService, deleteMcpService, activeMcpService, - uploadMcpIcon, + uploadMcpIcon }; diff --git a/src/views/api/components/McpDrawer.vue b/src/views/api/components/McpDrawer.vue index ea55682df4d0da2ac479d3c11762f8d7744c144d..ad67e20520e32616acc2f81c273b64f7348bc625 100644 --- a/src/views/api/components/McpDrawer.vue +++ b/src/views/api/components/McpDrawer.vue @@ -56,6 +56,7 @@ const form = reactive({ description: '', type: 'stdio', mcpConfig: '', + rawFile: null, }); const formRef = ref(); @@ -113,6 +114,8 @@ const beforeIconUpload: UploadProps['beforeUpload'] = async (rawFile) => { const reader = new FileReader(); reader.onload = (e) => { form.icon = e.target?.result as string; + form.rawFile = rawFile; + console.log('Icon uploaded:', rawFile); }; reader.readAsDataURL(rawFile); return false; @@ -125,14 +128,17 @@ const beforeIconUpload: UploadProps['beforeUpload'] = async (rawFile) => { return false; } }; - async function onConfirm(formEl: FormInstance | undefined) { if (!formEl) return; + const json = jsonEditorRef.value.getJsonValue(); if (json) form.mcpConfig = json; - await formEl.validate(async (valid) => { - if (!valid) return; - const [, res] = await api.createOrUpdateMcpService({ + + const valid = await formEl.validate(); + if (!valid) return; + + try { + const [, serviceRes] = await api.createOrUpdateMcpService({ serviceId: props.serviceId || undefined, overview: form.overview, icon: form.icon, @@ -142,12 +148,37 @@ async function onConfirm(formEl: FormInstance | undefined) { mcpType: form.type, }); - if (res) { - formEl.resetFields(); - jsonEditorRef.value.setJsonValue('{\n \n}'); - emits('success'); + console.log('MCP Service Response:', serviceRes); + console.log('MCP Service Response:', serviceRes.result.serviceId, form.rawFile); + + const serviceId = serviceRes.result.serviceId; + if (form.rawFile) { + try { + await api.uploadMcpIcon({ + serviceId, + icon: form.rawFile, + }); + } catch (error) { + console.error('Error uploading icon:', error); + ElMessage({ + message: 'Failed to upload icon!', + type: 'error', + }); + // 不阻断流程,仅提示 + } } - }); + + formEl.resetFields(); + jsonEditorRef.value.setJsonValue('{\n \n}'); + emits('success'); + + } catch (error) { + console.error('Create or update MCP service failed:', error); + ElMessage({ + message: 'Failed to create/update service!', + type: 'error', + }); + } } async function getMcpServiceDetail(serviceId: string) { diff --git a/src/views/createapp/components/AgentAppConfig.vue b/src/views/createapp/components/AgentAppConfig.vue index 33e17df20501c804001141e9f83653def523d8d6..743158e71bd7040f4cc963260cf29cf24c4d887a 100644 --- a/src/views/createapp/components/AgentAppConfig.vue +++ b/src/views/createapp/components/AgentAppConfig.vue @@ -139,15 +139,6 @@ const beforeIconUpload: UploadProps['beforeUpload'] = async (rawFile) => { const reader = new FileReader(); reader.onload = (e) => { createAppForm.icon = e.target?.result as string; - // 在上传时直接upload icon - (async() => { - console.log('Uploading icon...',rawFile,e.target?.result); - await api.uploadMcpIcon({ - icon: rawFile, - service_id: route.query?.appId as string, - edit: true, - }); - })() }; reader.readAsDataURL(rawFile); return false; diff --git a/src/views/createapp/index.vue b/src/views/createapp/index.vue index 303ad5e4f0a00701167c99e65bb57b8e54f1eed7..b1199aff1b08eb11e5cf888b8200a498903bb63e 100644 --- a/src/views/createapp/index.vue +++ b/src/views/createapp/index.vue @@ -137,11 +137,10 @@ const saveApp = async (type: 'agent' | 'flow') => { } else if (type === 'agent') { const formData = agentAppConfigRef.value.createAppForm; if (!formData) return; - // 配置 agent 接口去掉icon const [, res] = await api.createOrUpdateApp({ appId: route.query?.appId as string, appType: type, - // icon: formData.icon, + icon: formData.icon, name: formData.name, description: formData.description, dialogRounds: formData.dialogRounds, diff --git a/src/views/dialogue/components/MultiSelectTags.vue b/src/views/dialogue/components/MultiSelectTags.vue index 63b65799a6bee62a3378a1024ee075e70f5ff881..9f0628638c56d15baa1b1cdf694fc2707c810277 100644 --- a/src/views/dialogue/components/MultiSelectTags.vue +++ b/src/views/dialogue/components/MultiSelectTags.vue @@ -264,7 +264,7 @@ const checkTagsOverflow = () => { :deep(.el-collapse-item__content) { border-bottom: none; padding-bottom: 0px; - margin: 1px; + margin: 2px; } :deep(.el-collapse-item__header) { @@ -273,7 +273,7 @@ const checkTagsOverflow = () => { justify-content: flex-end; align-items: center; height: 16px; - margin-bottom: 8px; + margin-bottom: 0px; color: #8d98aa; font-size: 12px; border-top: none; @@ -441,6 +441,7 @@ const checkTagsOverflow = () => { /* 全局样式,不使用scoped */ .global-tag-modal { position: fixed; + border-radius: 8px; top: 60px; right: 16px; bottom: 46px; @@ -457,7 +458,7 @@ const checkTagsOverflow = () => { display: flex; justify-content: space-between; align-items: center; - padding: 15px; + padding: 24px 24px 0px 24px; h3 { margin: 0; @@ -487,7 +488,7 @@ const checkTagsOverflow = () => { .multi-select-list { display: flex; flex-direction: column; - gap: 12px; + gap: 16px; width: 100%; max-width: 600px; margin: 0 auto; @@ -501,8 +502,8 @@ const checkTagsOverflow = () => { border-radius: 8px; background-image: linear-gradient( to right, - rgba(109, 117, 250, 0.2), - rgba(90, 179, 255, 0.2) + rgb(231, 243, 255), + rgb(233, 237, 254) ); cursor: pointer; transition: all 0.2s ease; @@ -514,8 +515,9 @@ const checkTagsOverflow = () => { } &.selected { - border-color: #3498db; - background-color: rgba(52, 152, 219, 0.05); + border-color: #6395FD; + background-color: #6395FD; + outline: 2px solid #6395FD; &::after { content: ''; @@ -526,8 +528,8 @@ const checkTagsOverflow = () => { height: 0; border-style: solid; border-width: 0 24px 24px 0; - border-color: transparent #3498db transparent transparent; - border-radius: 4px; + border-color: transparent #6395FD transparent transparent; + border-radius: 0px 4px; } } }