From 78973c99a3b23803e88643022cc8126f28d03d5b Mon Sep 17 00:00:00 2001 From: jing <1683105490@qq.com> Date: Wed, 16 Sep 2026 16:38:34 +0800 Subject: [PATCH] =?UTF-8?q?chore=EF=BC=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/js/ai-service.js | 38 +++- common/js/config.js | 6 +- common/js/media-upload.js | 15 +- pages_tool/ai-chat/ai-chat-message.vue | 166 +++++++++++++++--- .../components/ai-chat-tools-panel.vue | 29 +-- 5 files changed, 197 insertions(+), 57 deletions(-) diff --git a/common/js/ai-service.js b/common/js/ai-service.js index 2584cba..e146994 100644 --- a/common/js/ai-service.js +++ b/common/js/ai-service.js @@ -116,6 +116,28 @@ function getUserId() { return guestId; } +/** + * 递归在 info 响应中查找配置 uuid (媒体上传必填)。 + * 后端字段名/层级不确定, 深度 4 内匹配 config_uuid / config_uid / uuid 任意字段。 + */ +function findConfigUuid(obj, depth) { + if (!obj || typeof obj !== 'object' || (depth || 0) > 4) return ''; + var keys; + try { keys = Object.keys(obj); } catch (e) { return ''; } + for (var i = 0; i < keys.length; i++) { + var k = keys[i]; + if (/^(config_uuid|config_uid|uuid)$/i.test(k) && obj[k]) return String(obj[k]); + } + for (var j = 0; j < keys.length; j++) { + var v = obj[keys[j]]; + if (v && typeof v === 'object') { + var found = findConfigUuid(v, (depth || 0) + 1); + if (found) return found; + } + } + return ''; +} + /** * 获取当前 AI Agent。 */ @@ -783,13 +805,14 @@ export default { async: false, }); console.log('[AI Service] getServiceConfig response:', JSON.stringify(response)); - // 媒体上传需要 config_uuid (后端校验 config_uid/config_uuid 不能为空)。 - // 此前从未写入过该缓存, 导致上传表单里 config_uuid 恒为空。 - // 这里从 info 响应中提取并持久化, 兼容多种字段名。 + // 媒体上传需要 config_uuid (后端校验不能为空)。递归查找并持久化。 const cfg = response && response.data; - if (cfg && typeof cfg === 'object') { - const uuid = cfg.config_uuid || cfg.config_uid || cfg.uuid || (cfg.info && (cfg.info.config_uuid || cfg.info.uuid)) || ''; - if (uuid) uni.setStorageSync('current_config_uuid', uuid); + const uuid = findConfigUuid(cfg, 0); + if (uuid) { + uni.setStorageSync('current_config_uuid', uuid); + console.log('[AI Service] 已缓存 config_uuid:', uuid); + } else { + console.warn('[AI Service] info 响应中未找到 config_uuid/config_uid/uuid 字段, 上传将缺少该参数。响应结构:', JSON.stringify(cfg)); } return response.data; } catch (error) { @@ -1038,9 +1061,10 @@ export default { /** * 获取当前 config_uuid (媒体上传路由用) + * 优先级: info 接口缓存 > 本地配置 (.local.config.js aikefuConfigUuid) */ getCurrentConfigUuid() { - return uni.getStorageSync('current_config_uuid') || ''; + return uni.getStorageSync('current_config_uuid') || Config.aikefuConfigUuid || ''; }, /** diff --git a/common/js/config.js b/common/js/config.js index 6ec955d..217c756 100644 --- a/common/js/config.js +++ b/common/js/config.js @@ -63,7 +63,7 @@ if (process?.env?.NODE_ENV === 'development') { } // #endif -const { uniacid = 0, domain = defaultDomain } = localDevConfig ?? { uniacid: 0, domain: defaultDomain } +const { uniacid = 0, domain = defaultDomain, aikefuConfigUuid = '' } = localDevConfig ?? { uniacid: 0, domain: defaultDomain } export default { /** @@ -80,6 +80,10 @@ export default { //api请求地址 baseUrl: domain, + // aikefu 智能客服配置 uuid (媒体上传必填; 后端 /api/kefu/info 目前不返回该值, + // 需在 .local.config.js 对应环境配置里手动填写 aikefuConfigUuid: 'xxx') + aikefuConfigUuid: aikefuConfigUuid, + // 图片域名 imgDomain: domain, diff --git a/common/js/media-upload.js b/common/js/media-upload.js index 004a9ba..777425e 100644 --- a/common/js/media-upload.js +++ b/common/js/media-upload.js @@ -99,8 +99,10 @@ async function uploadViaPhp(filePath, kind, addon, agentId) { name: 'file', formData: { kind, - agent_id: addon === 'aiagent' ? agentId : undefined, + // aikefu 后端必填 config_uuid; 同时兼容 config_uid 命名并附 agent_id 兜底 + agent_id: agentId || undefined, config_uuid: addon === 'aikefu' ? (aiService.getCurrentConfigUuid?.() || '') : undefined, + config_uid: addon === 'aikefu' ? (aiService.getCurrentConfigUuid?.() || '') : undefined, uniacid: aiService.getUniacid(), user_id: aiService.getUserId?.() || '', }, @@ -135,7 +137,13 @@ async function uploadViaPhp(filePath, kind, addon, agentId) { form.append('file', file) form.append('kind', kind) if (addon === 'aiagent') form.append('agent_id', agentId) - else form.append('config_uuid', aiService.getCurrentConfigUuid?.() || '') + else { + // aikefu 后端必填 config_uuid; 同时兼容 config_uid 命名并附 agent_id 兜底 + const uuid = aiService.getCurrentConfigUuid?.() || '' + form.append('config_uuid', uuid) + form.append('config_uid', uuid) + form.append('agent_id', agentId) + } form.append('uniacid', aiService.getUniacid()) form.append('user_id', aiService.getUserId?.() || '') const res = await fetch(Config.baseUrl + url, { @@ -184,8 +192,9 @@ async function uploadViaSts(filePath, kind, addon, agentId, config) { 'token': store.state.token || '' }, data: { - agent_id: addon === 'aiagent' ? agentId : undefined, + agent_id: agentId || undefined, config_uuid: addon === 'aikefu' ? (aiService.getCurrentConfigUuid?.() || '') : undefined, + config_uid: addon === 'aikefu' ? (aiService.getCurrentConfigUuid?.() || '') : undefined, uniacid: aiService.getUniacid(), user_id: aiService.getUserId?.() || '', }, diff --git a/pages_tool/ai-chat/ai-chat-message.vue b/pages_tool/ai-chat/ai-chat-message.vue index cf095d5..cde8d33 100644 --- a/pages_tool/ai-chat/ai-chat-message.vue +++ b/pages_tool/ai-chat/ai-chat-message.vue @@ -53,10 +53,16 @@ - - - 上传中... - {{ message.uploadError }} + + + + 上传中... + {{ message.uploadError }} + + + + {{ message.content }} + + + + + 上传中 + 失败 + × + @@ -353,8 +366,8 @@ + - - @@ -390,7 +403,7 @@