235adb5ebd
chore:优化工具调用的可见性控制,确保与思考过程开关一致;统一欢迎语字段名,移除冗余信息;兼容旧数据格式,提升数据处理的健壮性
2026-09-20 18:25:59 +08:00
744981ed93
chore:添加 chat_ui_config 支持,优化前端 UI 行为开关;实现附件类型动态控制,确保与后端配置同步
2026-09-20 18:01:43 +08:00
ee20c214de
chore:优化服务配置缓存逻辑,减少不必要的 API 调用;修复欢迎语加载逻辑,避免重复推送欢迎气泡;调整快捷问题样式以兼容低版本环境
2026-09-20 15:45:12 +08:00
8fd68033ed
chore:添加欢迎语配套快捷问题功能,支持用户快速发送常见问题;优化数据格式处理与样式
2026-09-20 15:07:43 +08:00
67ce0f8b39
chore:更新 AI 服务会话管理逻辑,优化用户状态切换时的 key 迁移与会话隔离,确保 H5 端 elicitResponse 请求正常处理
2026-09-19 15:26:38 +08:00
1b1704f7c6
chore:滑动图片是水平滑动滚动条根据后台显示,AI智能点赞svg
2026-09-18 09:58:15 +08:00
29699a66fd
chore:AI智能输入框样式改变
2026-09-17 14:21:28 +08:00
3b4051c775
chore:上传图片可以支持3张,正常显示
2026-09-17 09:48:49 +08:00
fffb5dae18
chore:用户的消息,图片在上文字在下
2026-09-17 09:11:59 +08:00
8cfc144ba9
fix(frontend): 端用户附件走 inline base64 路径, 避开 MediaGuard SSRF 闸门
...
PR-FRONTEND-MEDIA-INLINE-BASE64 (2026-09-16)
PR-WB-MP-INBOUND-MEDIA 配套
症状: 用户在前端上传图片成功后 (OSS URL 已返回), AI Agent 仍回复
"我这边并没有收到或看到任何图片附件".
根因链路:
1. backend Upload.php::buildPublicUrl 用 request()->domain() 拼 URL
(LAN 部署返回 http://192.168.x.x:8050/upload/ ..., 公网部署返回公网域名)
2. 前端把 upload 响应直接透给 AI chat attachments[] 字段
3. backend MediaGuard::urlAllowed 把 192.168.x.x 当内网 IP
(FILTER_FLAG_NO_PRIV_RANGE) 拒绝 → attachments 整批丢
4. 静默失败: MediaGuard 在 '白名单过滤后空集' 时返回 ok=true + media=[]
→ Kefu.php 不 return error, 业务继续走
5. WB 收到 0 个 media block → Agent 看不到附件
修复:
- media-upload.js 新增 fileToBase64(filePath, opts) helper
- H5: fetch(blobUrl) → blob → FileReader.readAsDataURL → strip data: 前缀
- MP-WEIXIN/APP-PLUS: uni.getFileSystemManager().readFileSync(base64)
- SIZE_LIMIT_INLINE_BASE64 = 5MB, 与后端 INLINE_MEDIA_LIMIT 对齐
- 超限 / 失败返回 null, 调用方退回 URL 路径
- ai-chat-message.vue sendMessage 改为 await Promise.all 模式:
- 对每个 pending item 调 fileToBase64(tempPath) 拿 base64
- 把 data + encoding='base64' 注入 attachment
- enrichedPendingAttachments 同时用于 readyAttachments + userMessage.attachments
- 复用同一份 base64, 不重复读 file
后端接收 data 字段后整条链路已对齐:
- MessageMedia::normalizeInput 直接透传 data 字段
- MediaGuard::check data 非空时无条件放行, 不参与 URL 校验
- WbAgentOsClient::buildMediaBlocks (A 路) 路径 1 优先 data + image/audio
- WbAcpClient::buildMediaBlocks (B 路) data 非空也走 inline base64
- inline_media_sanity.php 39 个断言全部覆盖 (test 3.1, 3.2, 4.1, 4.2, 7.6)
测试:
- E2E test_inline_base64.py 10/10 通过
- mock 上传返回 LAN URL 模拟 MediaGuard 拦截场景
- 抓 /api/kefu/chat POST body, 验证 attachments[].data 是有效 PNG base64
- magic bytes 89504E47 验证通过
- 既有 test_ai_chat_upload.py 20/20 通过 (无回归)
边界:
- >5MB 图片 fileToBase64 返回 null, 退回 URL 路径 (buildMediaBlocks 走
路径 2 fetchInline / 路径 3 resource_link); LAN 部署下仍可能被 MediaGuard
拦截, 但 5MB 以下的图片(主流微信/支付宝截图等)不受影响
- H5/MINIProgram/APP 三端都加了 #ifdef 编译条件
2026-09-16 17:55:49 +08:00
f2cb69cb06
fix(ai-chat): rename _pendingIdSeq → pendingIdSeq (Vue 2 strips underscore-prefix data)
...
PR-FRONTEND-MEDIA-UPLOAD-FIX-HOTFIX (2026-09-16)
Bug: Vue 2 在组件实例化时过滤掉 _ 和 $ 开头的数据属性.
`_pendingIdSeq: 0` 在 data() 里定义但 this._pendingIdSeq === undefined.
onImagePicked 中 `++this._pendingIdSeq` → NaN, 所有 pendingImage 的
localId 都是 NaN, Vue 'Duplicate keys detected: NaN' 警告.
E2E 实测发现 (test_ai_chat_upload.py 20/20 通过):
- pendingImages 应有 3 项 ✓
- 每张图 localId 独立递增 (1, 2, 3) ✓
- 3 张图独立上传成功 ✓
- DOM 渲染 3 个 .pending-item + 3 个 uni-image 缩略图 ✓
- canSendPendingImage computed = true → .top-send-btn 出现 ✓
- removePendingImage(localId) → 剩 2 张 ✓
- 失败场景: uploadError 有值 + pending-retry-delete 出现 ✓
修复: data 里改 pendingIdSeq: 0, 代码里改 ++this.pendingIdSeq
教训: Vue 2 data() 里禁止用 _ 或 $ 前缀的属性名.
2026-09-16 17:14:11 +08:00
fe2d3dcfe2
fix(ai-chat): 全面修复前端图片附件 4 个 P0 + 3 个 P1 + 3 个 P2 bug
...
PR-FRONTEND-MEDIA-UPLOAD-FIX (2026-09-16)
配合后端 PR-WB-MP-UPLOAD-EXT (HEIC/AVIF/BMP/TIFF 双层修复), 前端用户上传链路全面打通:
**4 个 P0 (阻塞用户上传)**:
- pendingImage 单数 → pendingImages 数组: 选 9 张图只发 1 张 → 全部一起发
- 每个图独立 localId 独立上传独立失败
- 失败给删除按钮 (用户不再卡死)
- MP-WEIXIN 不压缩 HEIC → H5+MP-WEIXIN 双端都压缩
- 微信 chooseImage 默认 compressed 不支持 HEIC, 必须本地 uni.compressImage
- getFileSize 失败兜底 0 → 失败抛错, 探测完全失败时兜底走 STS
- 0 > 2MB = false 让 auto 模式永远走 PHP 中转, 大文件 OOM
- 现: totallyUnknown → 兜底 STS
- guessMime 缺 HEIC 等 → 与后端 guessMimeFromPath 对齐 26 个 mime
**3 个 P1 (业务级)**:
- selectFile 微信小程序死按钮 → 加 #ifdef MP-WEIXIN 分支 (uni.chooseMessageFile/wx.chooseMessageFile)
- 兼容检测两个 API 哪个可用
- 上传失败后 pendingImage 永远卡住 → 失败时给 删除 按钮 (pending-retry-delete)
- URL.createObjectURL 永不释放 → upload 完成后 (成功/失败都) revokeObjectURL
**3 个 P2 (优化)**:
- filePath.split('.').pop() 在 blob URL 翻车 → 用 lastSegment + 正则提取 + 兜底 'bin'
- STS MP-WEIXIN size 永远 0 → 用已知 detectedSize + pathToFile 再探测
- H5 压缩阈值 10MB → 3MB
**新增**:
- tests/media-upload-fix.test.js (12 个单测全过): guessMime 现代格式 / extractExt blob URL / decideSts 兜底 STS 决策
2026-09-16 16:52:49 +08:00
78973c99a3
chore:
2026-09-16 16:38:34 +08:00
171190c1cd
chore:合并
2026-09-16 11:52:28 +08:00
7952f5a722
feat(ai-chat): frontend 媒体上传/播放全栈接通 (PR-FRONTEND-MEDIA-UPLOAD 2026-09-16)
...
P0 — 新建 common/js/media-upload.js (12KB)
- uploadImage(filePath) / uploadMedia(filePath, kind) 落地
- 此前 ai-chat-tools-panel.vue 引用但文件从未入库, 选图立即抛 "Cannot find module"
- 12 cloud provider 分流: 4-field STS (alioss/qiniu/txcos/baidubos/qingstor/jdoss/ucloud/wyoss) vs single-URL signed PUT (huaweiobs/volcengine/awsoss/minio)
- 端点必须 addon namespace: /<addon>/api/upload/{image|file|ossSts}, 普通 /api/kefu/upload/* 不命中 InitRoute
- 补 docs 设计稿漏写的 `import store from '@/store/index.js'` (H5 上传需带 token)
P1 — ai-chat-message.vue 用户附件全支持
- P1.1 filter 不再丢 file/audio/video 消息
- P1.2 用户气泡加 type==='file' 分支: 文件图标 + 名称 + 大小 + 上传状态
- P1.3 sendMessage type 不再强制把 audio/video 折成 file
P2 — AI 侧 audio 播放引擎接通
- P2.1 previewAttachment audio 分支 → 跳 file-preview
- P2.2 音频气泡接 uni.createInnerAudioContext: data 加 innerAudioCtx/_innerAudioSrc, 改写 playAudio/pauseAudio, beforeDestroy 必 destroy, slider 区分 change (显示) / changeend (实际 seek)
- P2.3 file-preview.vue 加 image-viewer + audio-viewer 两个分支;inferFileType 识别 jpg/png/mp3/wav 等扩展
P3 — sendMessageWithContent 透传 attachments 参数
- 默认 attachments = [], 传给 sendStreamMessage/sendNormalMessage
- tools panel 选完文件 push 到 attachments → 链到 send
lang — zh-cn + en-us file-preview 加 4 项
- audioUrlNotExist / audioDefaultTitle / audioPlaying / audioPaused
docs — docs/ai-agent-integration.md (跨 PR 累积同步, 2149 行)
- 版本基线提到 PR-WB-MP-INLINE-MEDIA (2026-09-16) 及之后
- 加 §3.1.5 attachments.data 字段协议 (PR-WB-MP-INLINE-MEDIA)
- 12 cloud provider 替换原"阿里云"单点 (PR-OSS-REGISTRY)
- media-upload.js 章节补 fileToBase64 (PR-FRONTEND-MEDIA-UPLOAD)
- 上传策略表 backend/oss_sts/auto 全替换为"云存储"措辞
对齐后端:
- PR-WB-MP-INLINE-MEDIA (a707b90): media data 字段
- PR-OSS-REGISTRY (12 provider): OssProviderRegistry
- PR-FRONTEND-MEDIA-UPLOAD (本 commit): 前端落地
兼容性:
- 后端未升级到 PR-WB-MP-INLINE-MEDIA 之前, attachments 不带 data 字段, 走 URL 路径 (退化到老行为, 不破)
- 后端 oss_sts 单点 alioss 时, securityToken 不带 -SIGNED 后缀, 走 4-field STS 分支 (与 PR-OSS-REGISTRY 之前兼容)
回归:
- node --check media-upload.js OK
- lang zh ESM import OK, 输出 8 个 key 全对
- ai-chat-message.vue 11 处 PR-FRONTEND-MEDIA-UPLOAD 标记, file-preview.vue 9 处
- 旧 chat 路径不带 attachments 走默认 [], 不破坏现有响应结构
安全约束: 不涉及 nginx 层防盗链 / 限速
2026-09-16 11:42:18 +08:00
3f99a1b9e4
chore:AI回答显示思考...
2026-09-16 11:14:53 +08:00
7a5de9a44f
chore:微信小程序也已显示思考过程
2026-09-16 08:44:19 +08:00
b4a8415a38
chore:AI智能回答没有气泡
2026-09-15 16:52:43 +08:00
782a26f446
chore:AI智能显示思考过程
2026-09-14 17:49:30 +08:00
278645230a
chore:回答行距变小,加上气泡,隐藏气泡下面的"..."
2026-09-14 08:57:45 +08:00
21ee661cef
chore:AI智能回答特殊文字有特殊显示
2026-09-12 14:43:57 +08:00
3fffab81c8
chore:可以复制回答
2026-09-12 11:03:34 +08:00
429487b1d1
chore:微信小程序真机智能客服正常
2026-09-12 09:20:51 +08:00
d15724dd2f
chore:用户气泡样式
2026-09-11 17:34:43 +08:00
4cb34bf28e
chore:用户可以自定义选择复制的文字
2026-09-11 17:14:42 +08:00
2daaa258a0
chore:AI智能可以复制语句
2026-09-11 14:43:23 +08:00
3892fb517f
chore:隐藏智能体的任务栏
2026-09-11 10:10:52 +08:00
659308e116
chore:任务栏的图标小程序正常
2026-09-11 09:29:56 +08:00
bc127a45e8
chore:输入框样式
2026-09-11 09:15:12 +08:00
596e7cdb03
chore:输入框的更多功能加上关闭按钮
2026-09-10 17:20:10 +08:00
f09fffb7ad
chore:点进智能AI页面,输入框移动到底部
2026-09-10 16:43:51 +08:00
a01587fc68
chore:修改智能AI页面
2026-09-10 16:36:25 +08:00
b2211edeab
refactor(formdata.vue): update default styles and config merging logic
...
- Adjusted the merging order of form configuration to prioritize frontend defaults when backend configurations are absent.
- Clarified comments regarding the purpose of new visual styles and their application.
- Modified the hideInnerBanner logic to ensure consistent behavior with the updated form styles.
2026-09-03 17:50:11 +08:00
b4c47fcc26
Merge branch 'dev/1.0' of http://git.aigc-quickapp.com/Uniapp/lucky_shop into temp221
...
# Conflicts:
# components-diy/diy-form.vue
2026-09-02 11:58:46 +08:00
b31c133d8e
chore:表单修改边距
2026-09-02 11:44:19 +08:00
2787e73126
chore:优化表单风格逻辑,支持显式和隐式判定,确保兼容性
2026-09-02 11:14:52 +08:00
a026adaec7
chore:表单样式修改
2026-09-01 09:24:09 +08:00
278d8c94f9
chore:表单样式修改表单浮于图片上方
2026-09-01 08:54:26 +08:00
c1407a84bb
chore:H5登录正常
2026-08-29 18:22:10 +08:00
6ffbae0f33
chore:表单弹窗正常
2026-08-29 17:44:26 +08:00
f6038575cc
chore:表单弹窗正常
2026-08-29 16:04:20 +08:00
ecb0789780
chore:表单样式更新
2026-08-28 11:58:23 +08:00
e693e4273c
chore:表单样式更新
2026-08-28 10:22:24 +08:00
e3171ef7ad
chore:H5正常
2026-08-26 18:13:00 +08:00
fcbbb05afe
chore:表单正常
2026-08-25 18:06:35 +08:00
dd94e53d81
chore:表单提交正常
2026-08-25 17:39:03 +08:00
b8ff67aaa3
chore:提交次数
2026-08-25 11:18:43 +08:00
58a5a7d535
Merge branch 'dev/1.0' of http://git.aigc-quickapp.com/Uniapp/lucky_shop into temp59
2026-08-24 09:31:08 +08:00
0e8db6f821
chore:PDF名字可以自定义
2026-08-22 16:04:33 +08:00
e6a45f6b7d
chore:PDF有显示了
2026-08-22 15:55:00 +08:00