cf902e0440
chore:语音输入图标更改
2026-09-30 11:30:26 +08:00
f555b8a946
chore:智能用户和回答都字号都25,不加粗
2026-09-30 10:49:08 +08:00
ce705d9d61
chore:文件图标正常
2026-09-30 10:01:17 +08:00
5f4dc370f8
chore:语音气泡正常
2026-09-30 09:28:22 +08:00
a978858254
chore:语音输入正常
2026-09-29 17:25:14 +08:00
10e6402ad6
chore:语音输入有返回
2026-09-29 16:46:59 +08:00
166a284359
Merge branch 'dev/1.0' of http://git.aigc-quickapp.com/Uniapp/lucky_shop into temp221
...
# Conflicts:
# .local.config.js
# common/js/ai-service.js
# common/js/media-upload.js
# docs/ai-agent-integration.md
# pages_tool/ai-chat/ai-chat-message.vue
# pages_tool/ai-chat/components/ai-chat-tools-panel.vue
# pages_tool/ai-chat/index.vue
2026-09-29 11:02:53 +08:00
5efae5c38b
feat(ai-chat): 增加自动定位权限提示及处理逻辑,优化用户体验
2026-09-28 13:57:46 +08:00
4168c24fd6
feat(ai-chat): 增强位置消息处理,支持透传位置、时间、页面上下文,优化用户体验
2026-09-28 13:48:56 +08:00
762401777b
feat(ai-chat): 增强多媒体消息处理,支持多条语音和视频同时发送,优化消息气泡显示逻辑
2026-09-28 11:30:40 +08:00
24c4e40df9
Merge remote-tracking branch 'remotes/origin/temp221' into temp221
2026-09-28 11:12:05 +08:00
c58734fcda
feat(ai-chat): 增强语音消息处理,支持多条语音同时发送及中央播放面板
2026-09-28 11:10:26 +08:00
bbc9fdd6ea
feat(ai-chat): 动态切换输入框 placeholder 文案,支持语音和媒体附件提示
2026-09-28 10:18:10 +08:00
4cd21ade51
fix(ai-chat): 修复 v-if/v-else 配对问题,优化输入框和语音图标布局对称性
2026-09-28 10:16:09 +08:00
0799e47233
feat(ai-chat): 在流式回答中添加"思考中..."指示,优化操作栏显示逻辑
2026-09-28 10:05:52 +08:00
306f2f7ff7
feat(voice-input): 改进音频消息处理,支持音频时长和指令文本,优化后端交互
2026-09-28 09:33:57 +08:00
fff10a2e19
feat(media-upload): 增加全量音视频格式支持,确保与后端一致
2026-09-24 18:03:08 +08:00
9d990e6aac
feat: implement voice input feature with press-and-hold gesture
...
- Added new language strings for voice input functionality in English and Chinese.
- Updated manifest to include microphone permission for voice recording.
- Enhanced ai-chat-message component to support voice input with visual feedback for recording and cancellation gestures.
- Integrated voice recorder functionality in ai-chat-voice-panel, allowing users to record audio with a maximum duration of 60 seconds.
- Implemented audio handling logic to upload recorded audio files and display them in the chat interface.
- Added error handling for voice recording failures and user notifications.
- Updated styles for improved UI/UX during voice recording interactions.
2026-09-24 17:47:37 +08:00
74468e2c9d
feat(ai-chat): 暂时隐藏模型选择器,统一使用 Auto 模式
2026-09-24 17:31:15 +08:00
f40c4b2a69
Merge branch 'temp221' of http://git.aigc-quickapp.com/Uniapp/lucky_shop into temp221
2026-09-24 17:05:26 +08:00
85b3e4db47
chore:AI回答的文字只有网址是蓝色,其他回答是黑色的
2026-09-24 13:59:24 +08:00
0197224c75
chore:H5所有气泡都统一
2026-09-24 11:59:50 +08:00
70f8fb867d
feat(chat-ui): 增加聊天 UI 配置的本地持久化和预加载功能,优化首帧渲染体验
2026-09-24 11:10:21 +08:00
86b87eeb9d
feat(ai-chat): 聊天 UI 配置 V3 — 名称/头像/时间配置项消费
...
- CHAT_UI_DEFAULTS 同步后端 4 新键 (show_name/show_avatar/avatar/time_format/time_humanize)
- 标题与 AI 头像按开关显隐, 自定义头像 (素材库 pic_path / URL) 优先于内置
- formatTime 支持 auto(智能分段)/full(完整) 与 humanizeTime 相对时间优先 (刚刚/N分钟前/N小时前/昨天/前天/M月D日/Y年M月D日)
- i18n 中英各+5 键
2026-09-24 10:30:28 +08:00
2016b87b6e
chore:回答问题视口随文字增长一直是贴着最新一句往上走。
2026-09-23 17:12:11 +08:00
a42ad4ebb3
chore:新增AI智能问题是否合并回答/单独回答
2026-09-23 16:25:39 +08:00
158750b933
chore:删除AI回答后下面出现修改图标的英文
2026-09-23 15:26:36 +08:00
3abe65de2a
chore:H5的气泡修改
2026-09-23 15:22:19 +08:00
c0e432cc22
chore:微信小程序真机可以自定义复制
2026-09-23 15:04:27 +08:00
f8115f47fd
chore:AI修改新对话按钮图标,搜索记录按钮向上移动,删除AI回答后的AI名称
2026-09-23 14:13:54 +08:00
0ee97f902d
chore:跳转文章列表链接可以分类
2026-09-23 11:15:47 +08:00
3079cf4ba5
chore:点赞图标正常
2026-09-22 10:39:01 +08:00
aefb0c1550
Merge branch 'temp221' of http://git.aigc-quickapp.com/Uniapp/lucky_shop into temp221
2026-09-21 08:53:52 +08:00
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
62b4b44f88
chore :真机可以支持测试
2026-09-20 14:06:28 +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