From 244f0c24d81ce24a8831ed184d30da4358323edb Mon Sep 17 00:00:00 2001 From: weicw1996 Date: Tue, 13 Oct 2026 20:17:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(ai):=20=E9=97=AE=E7=AD=94=E5=8A=A9?= =?UTF-8?q?=E6=89=8B=E9=A1=B5=E5=85=A5=E5=8F=A3=E5=AF=B9=E9=BD=90=20web?= =?UTF-8?q?=EF=BC=8C=E6=94=B9=E4=B8=BA=E3=80=8C=E8=81=8A=E5=A4=A9/?= =?UTF-8?q?=E5=86=99=E4=BD=9C/=E5=9B=BE=E7=89=87=E3=80=8D=EF=BC=88issue=20?= =?UTF-8?q?15=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 模式标签由「聊天/稿件/创意/策划」改为「聊天/写作/图片」,去掉策划链路; 写作与图片两个入口补上 web 端已有的表单与附件能力。 - 新增 pages/assistant/writing-params.js:web 端 writing-params.ts 的等价移植 (零依赖纯函数)。写作模式加「文体/字数」面板,入参优先级改为 「界面显式选择 > 键值入参 > 自然语言推断 > 默认值」——过去没有表单, 只按「键:值」解析,解析不到就一律回落 doc_type=新闻稿 / Number=800, 而上游提示词把这两项当主控指令,会直接压掉用户原话里的诉求(issue 13) - 图片模式加「图片比例 + 参考素材」:附件组装成 user_files(上限 5, 类型 image/video/audio/document),比例作为文本追加进 user_content - chat-service 新增 uploadAiFile(file, app);上传必须带 app='creativeAssistant' —— Dify 的 /files/upload 按应用鉴权,不传 app 的附件必然报 Invalid upload file(issue 14) - 删除 buildOutlinePayload / formatOutlineResult 与 activityOutlineGen import; 顺带清掉本次改动块内的死代码(未使用的 getCurrentUser、pickDisplayableText) 顺带修掉同源缺陷:pages/creative-assistant 的 uploadAiFile(file) 也没传应用凭证, 该页附件同样是坏的(issue 14 记的 gxmu/creativeAssistant 表单页那个缺陷)。 验证:移植等价性用例 8/8 —— 同一张用例表同时喂给小程序与 web 两端实现逐字段比对 JSON,另加 4 条常量/边界断言(防「两边一起错」);模板↔脚本静态一致性检查 (模板绑定名、this.X() 调用点、已删标识符残留)全绿,判别力经 5 处变异测试证伪; 5 个改动文件 node --check 通过,style 块花括号配平。 本机无 HBuilderX CLI 与 package.json,真机/微信开发者工具未跑。 本文件同时带有此前未提交的 issue 01 跟进改动(resolveFailedCreativeText: 创意失败态采用后端按原因映射的文案,但仍过 isDisplayableAnswer 兜底), 同一文件无法拆分。 Refs: .scratch/ai-assistant/issues/15-uniapp-assistant-modes-align-web.md --- pages/assistant/chat-service.js | 52 +++ pages/assistant/index.vue | 532 +++++++++++++++++++++++----- pages/assistant/writing-params.js | 341 ++++++++++++++++++ pages/creative-assistant/index.vue | 4 +- pages/creative-assistant/service.js | 22 +- 5 files changed, 850 insertions(+), 101 deletions(-) create mode 100644 pages/assistant/writing-params.js diff --git a/pages/assistant/chat-service.js b/pages/assistant/chat-service.js index ef5598f..5f5e95f 100644 --- a/pages/assistant/chat-service.js +++ b/pages/assistant/chat-service.js @@ -434,6 +434,58 @@ export function activityOutlineGen(data) { }) } +/** + * AI 文件上传(喂给 Dify 开始节点的 file-list 变量)。 + * + * @param {object} file `uni.chooseImage` / `uni.chooseMessageFile` 拿到的临时文件(需有 `path`) + * @param {string} [app] 应用代号(后端按代号选择 Dify 应用凭证) + * + * `app` 不是可选项而是**硬约束**:Dify 的 `/files/upload` 按应用鉴权, + * 文件只能被「上传时所用应用」的工作流引用,换个应用引用同一个 `upload_file_id` + * 会直接报 `Invalid upload file`(issue 14 实测:chat Key 上传 → 0.2s 失败, + * creativeAssistant Key 上传 → succeeded)。 + * + * 后端 `/ai/file/upload` 不传 `app` 时保持旧行为(`type` 为空 → chat 凭证), + * 所以喂给创意助手 file-list 的附件**必须**传 `app: 'creativeAssistant'`。 + */ +export function uploadAiFile(file, app) { + const token = getToken() + const formData = { + tenantId: DEFAULT_TENANT_ID + } + if (app) { + formData.app = app + } + return new Promise((resolve, reject) => { + uni.uploadFile({ + url: `${API_BASE_URL}/ai/file/upload`, + filePath: file.path, + name: 'file', + header: token + ? { + Authorization: token + } + : {}, + formData, + success: (response) => { + try { + const result = JSON.parse(response.data || '{}') + if (result.code === 0 && result.data) { + resolve(result.data) + return + } + reject(new Error(result.message || '上传失败')) + } catch (error) { + reject(new Error('上传响应解析失败')) + } + }, + fail: (error) => { + reject(new Error(error.errMsg || '上传失败')) + } + }) + }) +} + export function buildWebSocketUrl(userId) { const url = String(API_BASE_URL || '') if (/^https?:\/\//.test(url)) { diff --git a/pages/assistant/index.vue b/pages/assistant/index.vue index e37ba1f..32489bb 100644 --- a/pages/assistant/index.vue +++ b/pages/assistant/index.vue @@ -22,7 +22,7 @@ - AI 助手 + {{ assistantTitle }} {{ activeChatTitle }} · {{ userName }} @@ -49,9 +49,9 @@ - 你好,我是 AI 团委助手 + 你好,我是 {{ assistantTitle }} - 你可以直接提问团务流程问题,我会通过实时消息回复。 + {{ assistantHint }} @@ -112,6 +112,54 @@ {{ item.label }} + + 文体 + {{ item.label }} + 字数 + {{ item.label }} + + + + 图片比例 + {{ item.label }} + + + + 参考素材 + {{ uploadingFiles ? '上传中...' : '添加附件' }} + + 最多 {{ IMAGE_FILE_LIMIT }} 个,支持图片 / 视频 / 音频 / 文档 + + + + {{ item.name }} + 移除 + + + +