fix: align Windows dev, App compiler, and ASR

This commit is contained in:
key
2026-07-26 21:27:37 +08:00
parent f57e0a53c6
commit 9ae5f750c8
22 changed files with 698 additions and 791 deletions
@@ -107,7 +107,7 @@ SOP 只解决标准问题,老师傅真正值钱的是案例、策略和火候
## 7. AI 接口和供应商口径
核心原则:**系统不绑定单一模型厂商**。后端统一走模型配置表,按能力分成 `chat / vector / rerank / asr / tts / vision` 六类。只要厂商支持 OpenAI-compatible API,就可以接入。
核心原则:**系统不绑定单一模型厂商**。后端统一走模型配置表,按能力分成 `chat / vector / rerank / asr / tts / vision` 六类。通用能力优先复用 OpenAI-compatible API;供应商契约不同的能力由后端按供应商和模型分流,客户端仍使用统一业务接口。
### 7.1 当前系统内置/预留的供应商
@@ -116,9 +116,9 @@ SOP 只解决标准问题,老师傅真正值钱的是案例、策略和火候
| OpenAI 兼容接口 | 通用兜底入口 | 可接企业自有网关或任何兼容服务 |
| DeepSeek | Chat 大模型候选 | 适合文本生成、问答、总结 |
| 智谱 AI | Chat / embedding / rerank 候选 | 代码内保留供应商入口 |
| 阿里云百炼 / 通义千问 | Chat 大模型候选 | 兼容模式接入 |
| 阿里云百炼 / 通义千问 | 生产短音频 ASR/TTS;Chat、实时语音候选 | 短音频 ASR 使用 `qwen3-asr-flash` 兼容模式,密钥只保存在受控配置 |
| Ollama | 本地模型候选 | 可用于内网/离线试验 |
| 硅基流动 SiliconFlow | 当前重点接入方向 | bge-m3 向量、SenseVoice ASR、CosyVoice2 TTS、部分图像模型 |
| 硅基流动 SiliconFlow | 向量、重排及语音兼容供应商 | bge-m3、OpenAI audio 兼容 ASR、CosyVoice2 TTS、部分图像模型 |
### 7.2 各类 AI 能力怎么接
@@ -127,8 +127,8 @@ SOP 只解决标准问题,老师傅真正值钱的是案例、策略和火候
| 大模型对话/总结 | `chat` | DeepSeek、通义千问、智谱、硅基流动、企业自有 OpenAI 兼容网关 | 面试出题、评分、案例整理、SOP 总结、资料归类 |
| 向量化 embedding | `vector` | 硅基流动 `BAAI/bge-m3`、智谱 `embedding-3` | SOP/案例/资料切片后做语义检索 |
| 重排序 rerank | `rerank` | bge-reranker 类模型,供应商可走硅基流动或智谱兼容接口 | 多条知识命中后按语义相关度排序 |
| 语音识别 ASR | `asr` | 硅基流动 `FunAudioLLM/SenseVoiceSmall` | 员工语音训练、案例语音上传、视频音轨转写 |
| 语音合成 TTS | `tts` | 硅基流动 `FunAudioLLM/CosyVoice2-0.5B`;二期可评估 MiniMax 语音 | AI 业主播报、SOP 朗读、模拟不同语气声 |
| 语音识别 ASR | `asr` | 生产使用阿里云百炼 `qwen3-asr-flash`;SiliconFlow OpenAI audio 接口保留兼容 | 员工语音训练、案例语音上传、视频音轨转写 |
| 语音合成 TTS | `tts` | 生产优先阿里云百炼 `qwen-audio-3.0-tts-flash`;SiliconFlow CosyVoice2 保留兼容 | AI 业主播报、SOP 朗读、模拟不同语气声 |
| 图片/视频画面理解 | `vision` | 多模态 Chat 模型;二期可评估火山 Doubao-embedding-vision | 图片 OCR、视频关键帧描述、以图搜图 |
| 向量数据库 | Qdrant | 自建 Qdrant 服务 | 只存向量索引和最小 payload,事实源仍是 MySQL/MinIO |
| 原始文件存储 | MinIO / sys_oss | 当前自建 MinIO | 存 SOP、候选资料、语音、图片、视频 |
+1 -1
View File
@@ -12,7 +12,7 @@
| 训练场景运营 `/train/scenarios` | 内容读取 `GET /api/train/practice/scenarios`、`GET /scenarios/{id}`;管理写入 `POST /scenarios`、`PATCH /scenarios/{id}/enabled`、`PATCH /scenarios/{id}/review-status`;目录 `GET /curriculum/capabilities`、`GET /curriculum/matrix` | 读取默认只返回当前租户“已发布且启用”的场景,且不返回审核人、稳定用户 ID 或审核时间;仅 `superadmin/hr_operator` 可请求 `includeDisabled=true`、编辑、启停和推进审核。状态只能按 `草稿 → 待业务审核 → 已发布 → 已下线` 流转;发布时服务端重新读取场景并校验住宅范围、固定五岗位、成长能力项、业务来源/SOP、服务红线、目标、成功标准、至少两轮回合和完整五维 Rubric,不信任客户端传入的发布内容。每次编辑已发布内容会退回待业务审核并刷新内容版本/哈希及审核留痕。运营可以选择风险级别,但服务端会对收费、安全、投诉等受控词及全部回合文本自动升级为“高风险”;待评估内容不可发布。高风险场景先记录第一位审核人的稳定用户 ID 和显示名并保持待业务审核,只有第二位不同的已认证运营人员复核同一内容版本后才发布;迁移重跑不得清空等待复核的首审记录。员工可见和可启动路径始终同时要求 `review_status=已发布 AND enabled=1`。 |
| M2 训练预习与求助 | `GET /api/train/practice/scenarios/{id}/prep-card`、`POST /api/train/practice/sessions/{sessionId}/help` | 均要求已登录;预习卡只使用当前租户已启用的 `prep_card/json_prep` 模板,模型返回必须严格为 3 条要点、3 条红线、2 条话术,否则回退场景卡。求助接口只允许 APP 员工访问其本人、同租户的活动训练会话;客户端可传 `roundIndex` 仅为兼容字段,服务端按会话实际进度落库,返回 `{sessionId,scenarioId,roundIndex,recordedAt}`。迁移表为 `aihr_practice_help_event`,不在请求路径执行 DDL。该表已随 2026-07-24 完整包发布并纳入远端 `62/62` 结构预检;完整训练写入与正式试点仍需另验。 |
| 正式试点数据导出 | `GET /api/train/practice/export?startDate=YYYY-MM-DD&endDate=YYYY-MM-DD` | 起止日期必填且包含结束日;只统计窗口内能通过唯一手机号或外部 ID 映射到在职组织快照的正式会话,排除重复手机号和身份碰撞。完训定义为每人至少 10 次,校准必须关联同一窗口内正式会话;CSV 同时给出校准命中数、SOP 可用数、满意度响应数/平均分,以及明细级 AI 分、人工校准分、校准人、校准时间、最终采用分、满意度分和意见,避免用四舍五入后的比率反推门禁状态;汇总和明细均携带正式人员及项目口径,不混入历史 seed/开发身份 |
| 对练语音 | `POST /api/ai/asr`(multipart 字段 `file`,≤5MB)、`POST /api/ai/tts`(JSON `{text≤300字, voice?, voiceProfile?:{role,voice?,speed?,emotion?,dialect?}, practiceContext?:{sessionId,turnIndex,role:'customer'}}`,`dialect` 仅接受 `mandarin/cantonese/sichuanese`,非法值返回业务码 `400`;旧 `voice` 兼容;成功返回 `ossId`,客户端播放地址为受控的内联 `data:audio/*`,不返回原始 OSS URL)、`GET /api/aihr/mobile/oss/{ossId}` | 走 OpenAI-compatible audio 接口;生产 SiliconFlow CosyVoice2 按角色映射老师傅/业主/面试官音色,业主对练再按已有情绪分切换平静/严肃/强烈语气和语速;dialect 作为语气提示传给支持表现力提示词的 TTS,不含克隆,也不等同于方言正式验收。`practiceContext` 仅允许已认证 APP 员工把本次服务端生成的业主 TTS 绑定到本人当前或刚完成会话的指定原话术回合;服务端重新校验租户、员工身份、回合和文本,不接受员工端传 OSS ID 或任意角色。设备语音降级按方言选择语言:粤语使用 `zh-HK`,四川话无法由设备语音可靠模拟时明确提示用户转用服务端语音或文字,不伪装成普通话。模型管理需启用 `category=asr/tts` 配置;移动端优先用浏览器录音,`getUserMedia/MediaRecorder` 不可用或麦克风权限失败时,用 `audio/*` file input 选择/录制音频后继续调同一 ASR 接口;ASR/TTS 未配置或失败返回 fail,前端降级设备语音或文本;训练/每日题录音只通过 `audioOssId` 走受保护下载,历史客户端传入的 HTTP `audioUrl` 不再回显;TTS 成功音频仍写入 `sys_oss` 留痕,同时用内联 data URL 保持旧客户端可播放;移动端 OSS 下载只允许经本人或主管项目范围验证的 APP 身份,后台账号若需回放必须使用未来独立、受审计的管理端契约。 |
| 对练语音 | `POST /api/ai/asr`(multipart 字段 `file`,≤5MB)、`POST /api/ai/tts`(JSON `{text≤300字, voice?, voiceProfile?:{role,voice?,speed?,emotion?,dialect?}, practiceContext?:{sessionId,turnIndex,role:'customer'}}`,`dialect` 仅接受 `mandarin/cantonese/sichuanese`,非法值返回业务码 `400`;旧 `voice` 兼容;成功返回 `ossId`,客户端播放地址为受控的内联 `data:audio/*`,不返回原始 OSS URL)、`GET /api/aihr/mobile/oss/{ossId}` | ASR 按供应商分流:SiliconFlow 等 OpenAI audio 兼容服务继续走 `/audio/transcriptions` multipart;阿里云百炼 `dashscope/qianwen + qwen3-asr-flash` 走工作空间 `/compatible-mode/v1/chat/completions`,将短音频编码为 Base64 `input_audio` 并读取 `choices[0].message.content`,请求上限仍由本接口收窄为 5MB。生产 TTS 优先阿里 `qwen-audio-3.0-tts-flash`,旧 SiliconFlow CosyVoice2 保留兼容;按角色映射老师傅/业主/面试官音色,业主对练再按已有情绪分切换平静/严肃/强烈语气和语速;dialect 作为语气提示传给支持表现力提示词的 TTS,不含克隆,也不等同于方言正式验收。`practiceContext` 仅允许已认证 APP 员工把本次服务端生成的业主 TTS 绑定到本人当前或刚完成会话的指定原话术回合;服务端重新校验租户、员工身份、回合和文本,不接受员工端传 OSS ID 或任意角色。设备语音降级按方言选择语言:粤语使用 `zh-HK`,四川话无法由设备语音可靠模拟时明确提示用户转用服务端语音或文字,不伪装成普通话。模型管理需启用 `category=asr/tts` 配置;移动端优先用浏览器录音,`getUserMedia/MediaRecorder` 不可用或麦克风权限失败时,用 `audio/*` file input 选择/录制音频后继续调同一 ASR 接口;ASR/TTS 未配置或失败返回 fail,前端降级设备语音或文本;训练/每日题录音只通过 `audioOssId` 走受保护下载,历史客户端传入的 HTTP `audioUrl` 不再回显;TTS 成功音频仍写入 `sys_oss` 留痕,同时用内联 data URL 保持旧客户端可播放;移动端 OSS 下载只允许经本人或主管项目范围验证的 APP 身份,后台账号若需回放必须使用未来独立、受审计的管理端契约。 |
| 实时对练 Beta(WebRTC) | `POST /api/train/practice/realtime/sdp`、`GET /realtime/personas`、`POST /realtime/session`、`POST /realtime/tools/invoke` | H5 浏览器及 App-Plus renderjs WebView 内的 WebRTC 直连阿里云(音频不过服务端),后端仅代理 SDP 交换(3 次/分/账号,sessionId 仅作日志关联且限字符)。人设为服务端 `AihrRealtimePersonaRegistry` 白名单:`owner-calm` 业主·常规(默认)、`owner-impatient` 业主·急躁、`digital-mentor` 数字师傅;人设绑定默认音色,客户端只选不编。`session.update`(instructions/音色/turn_detection/tools 声明)由 `/realtime/session` 组装下发,客户端原样转发;personaId 空白回落默认人设;会话记录写 Redis 30min(成功工具调用滑动续期),创建限流 6 次/分/账号。`digital-mentor` 声明 `search_knowledge` 工具:模型 function calling 命中(`response.function_call_arguments.done`)时客户端回传 `/realtime/tools/invoke`,服务端按登录态 + Redis 会话归属 + 人设工具白名单三重校验后走 `searchAuthorized` 浅层检索(不生成 LLM 答案、不落 `aihr_agent_run`;`source=realtime` 跳过 SOP 评审与知识缺口写入),output 拼接 ≤3 条片段并截断 1200 字;工具按账号限流 20 次/分,无授权/无结果/超时一律返回软着陆文案让模型如实作答,不中断语音会话。实时 Beta 不计分、不持久化训练数据;H5 与 App-Plus 均支持,App-Plus 在 renderjs 视图层执行媒体/WebRTC 并通过逻辑层复用受认证 SDP 与工具接口;需 APP 员工登录态,不启用模型 `enable_search`。配置 `AIHR_QWEN_REALTIME_ENDPOINT` / `AIHR_QWEN_REALTIME_API_KEY` / `AIHR_QWEN_REALTIME_MODEL`(模型白名单 `qwen3.5-omni-(flash|plus)-realtime`),密钥只放 `.env.local` 或外部环境变量。 |
| 案例沉淀 `/knowledge/cases` | `GET /api/knowledge/case/capabilities`、`POST /api/knowledge/case/upload`、`/organize`、`/curate`、`GET /records`、`GET /records/{caseId}`、`POST /records/{caseId}/review`、`GET /records/{caseId}/media` | `/capabilities` 返回服务端判定的案例提交/查看能力,移动端不再向普通员工展示无权提交的素材表单;`/upload` 改为 multipart 真实语音上传并走 ASR,服务端只接受 MP3/WAV/M4A/WebM/OGG/AAC/FLAC,成功后原始音频写入 `sys_oss`,案例记录只保存 `mediaOssId` 供受保护媒体接口读取,不向客户端回传原始 `mediaUrl`;`/organize` 用真实转写调 chat 模型整理案例,未配置模型时按真实 transcript 本地结构化,并从背景外的真实摘要项提取学习点;APP 用户必须先以认证手机号精确校验在职 `person_phone`,再由可信主体解析 `aihr_org_snapshot` 项目范围;案例 SQL 不得把 `person_phone` 与 `ext_party_id` 作为替代查询键。上传、整理、入库、列表和详情均按该项目范围校验,未完成正式组织映射时安全拒绝,不接受前端伪造项目范围;员工列表/详情只返回 `已入库` 案例,管理端系统用户保留全局运营视图;移动端和管理端案例详情通过受保护媒体接口回放原始音频,主管/项目负责人可提交脱敏点评;预渲染视频样片仍待正式媒体资产接入 |
| 案例媒体安全 | `GET /api/knowledge/case/records/{caseId}/media` | 案例详情只返回 `mediaOssId`,不返回原始 `sys_oss.url`;媒体下载会重复执行登录、后台角色或 APP 项目范围校验,再由服务端流式读取 OSS。管理端与 `mobile-uni` 通过鉴权 blob/temp 文件播放,关闭详情页时释放本地对象 URL |
+9 -9
View File
@@ -1,8 +1,8 @@
# BRD 功能审查与未完成项记录
> 当前基线:2026-07-25。最新完整生产发布源为 `230dfb4d`,包含五岗位训练内容运营、M2—M3 训练闭环、数字师傅 Agent,以及公司消息 R1—R3 和多岗位解读;当前源码 `acd5fd3a` 另含尚未部署的常规陪练“建议回复”。当前真相以本文件、[生产迁移 Runbook](BRD_PRODUCTION_MIGRATION_RUNBOOK.md)、[Changelog](../CHANGELOG.md)和每次发布的只读预检为准。
> 当前基线:2026-07-26。最新完整生产发布源仍为 `230dfb4d`,包含五岗位训练内容运营、M2—M3 训练闭环、数字师傅 Agent,以及公司消息 R1—R3 和多岗位解读;其后仅发布了阿里云百炼 ASR 后端热修复和生产模型配置,未重新发布静态资源或执行 schema 迁移。当前真相以本文件、[生产迁移 Runbook](BRD_PRODUCTION_MIGRATION_RUNBOOK.md)、[Changelog](../CHANGELOG.md)和每次发布的只读预检为准。
>
> 数字师傅 Agent、`aihr_agent_run` 和对应移动端改造已随 2026-07-25 完整包部署;当前只确认包、schema 和基础运行一致,Agent 专项认证态业务回归及真机验收仍未完成。
> 数字师傅 Agent、`aihr_agent_run` 和对应移动端改造已随 2026-07-25 完整包部署;2026-07-26 已在一台 Android HBuilderX 标准基座跑通生产 ASR 请求,但 Agent 专项认证态业务回归及自定义基座完整真机验收仍未完成。
>
> 后台已不再暴露个人训练、主管复盘或成长证据入口;这些能力仅留在认证 APP。该收口已随 2026-07-25 完整包部署,但员工训练写入、主管复盘和真机媒体仍需专项生产验收。
>
@@ -24,10 +24,10 @@
|---|---|---|
| 已实现 | 是 | 已有阶段一主功能,公司消息 R1—R3 已实现直通车与公司文件提炼闭环;接口事实见 [API_INTEGRATION.md](API_INTEGRATION.md) |
| 本地自动化/API 验证 | 是 | 训练运营定向后端测试 `76` 项;公司消息新增后端 `30` 项、管理端 `2` 项、移动端 `2` 项;管理端/H5 构建通过 |
| 本地浏览器/视觉验证 | 部分 | 已检查管理端目录/任务、两轮动态对练、岗位不匹配拦截、直通处理和文件消息;线上已以认证态员工完成公司消息回归。训练完整写入和真机验收仍未完成 |
| 本地浏览器/视觉验证 | 部分 | 已检查管理端目录/任务、两轮动态对练、岗位不匹配拦截、直通处理和文件消息;线上已以认证态员工完成公司消息回归。Android 标准基座生产 ASR 已通过,训练完整写入和原生全项验收仍未完成 |
| 已部署 | 是 | 管理端、H5、后端、公司消息 R1—R3、训练内容运营、M2 求助事件和租户组织治理迁移已发布;线上静态资源及 AIHR 模块与本地构建一致 |
| 生产基础验证 | 是 | 服务 `active`;根站、H5、租户接口和员工首页 API 正常;远端完整预检为 `64/64`,且管理端/H5 资源、AIHR 模块与本地构建匹配 |
| 生产完整业务验收 | 部分 | 公司消息已完成认证态全员文件消息和直通车闭环;训练写入、主管复盘、定向人群正反例、正式处理人绑定、真机媒体与严格试点窗口仍未完成 |
| 生产完整业务验收 | 部分 | 公司消息已完成认证态全员文件消息和直通车闭环,单台 Android 标准基座已完成生产 ASR;训练写入、主管复盘、定向人群正反例、正式处理人绑定、其他真机媒体与严格试点窗口仍未完成 |
“已部署”不等于“正式试点通过”。当前可以确认生产包和基础运行状态,不能把未执行的正式账号、真机和业务窗口验收写成已完成。
@@ -69,7 +69,7 @@
|---|---|---|
| 不同角色/岗位内容 | 员工、候选人、主管独立入口;岗位来自组织系统,主管可切换学员模式但不改变组织身份 | 生产包已部署;全岗位内容矩阵和正式权限正反例仍需业务数据 |
| 字号适老化 | 标准/大字/超大字全局持久化,同一页面结构响应式增高 | 本地多视口视觉通过;真实手机触控、键盘和读屏未验收 |
| 问师傅语音与播报 | 录音、选择音频、ASR、TTS/设备语音降级恢复;答案、总结卡、每日题、点评等关键内容可播报 | 生产包已部署;生产 CosyVoice2 已按老师傅/业主/面试官区分音色,业主情绪语气与语速已在生产 H5 验证;真实手机权限、弱网、方言和正式 ASR 仍未验收 |
| 问师傅语音与播报 | 录音、选择音频、ASR、TTS/设备语音降级恢复;答案、总结卡、每日题、点评等关键内容可播报 | 生产短音频 ASR 已切换为 `dashscope/qwen3-asr-flash`,并在一台 Android HBuilderX 标准基座完成“按住说话”请求;自定义基座权限、弱网、方言、多机型和完整播报仍未验收 |
| 问师傅连续对话与资料 | 认证用户短期会话保留 30 分钟/最新 6 轮,追问改写并路由 `QA/FILE/VIDEO/DATA_TOOL`;原文件/视频只从当前命中且实时授权的附件交付,无资源不造假链接 | 公司文件消息的认证下载与追问已生产验证;一般知识命中文件/视频的真机下载仍待复验 |
| 问页面有效会话区与消息追问 | 会话开始后收起占位辅助区;大喇叭详情仅以消息 ID 受控进入短会话,消息/知识回答不伪造待办 | 生产认证态发布—阅读—文件追问已验证;390×844 最终截图和真机体验仍待补 |
| 银城大喇叭 | 全员/定向、必读、未读/已读、发布/撤回、单文件异步提炼、摘要、受控下载和文件追问已部署 | 全员文件消息闭环已生产认证验证,测试消息已撤回;仍不含修订、补推和外部强触达,定向正反例待补 |
@@ -90,14 +90,14 @@
1. 选定 1–2 个真实项目、正式员工名单和起止日期,固定试点窗口。
2. 使用已授权的生产登录方式完成员工、主管、候选人和后台角色正反例;当前受控登录方式可用于验收,不再作为“无法验收”的理由。
3. 在真实手机复验录音/选音频、TTS/设备语音、图片/视频附件、总结卡下载、三级字号、键盘和读屏。
3. 在自定义基座继续复验录音拒绝/选音频、TTS/设备语音、图片/视频附件、总结卡下载、三级字号、键盘和读屏;标准基座的单次 ASR 成功不能替代这些项目。
4. 以同一窗口收集训练、人工校准、SOP 评审、满意度和案例样本,再运行 `AIHR_PILOT_STRICT=true ./scripts/demo-check.sh`。
### P1:业务配置与终态能力
1. 由业务确认五岗位正式场景、题库、SOP、资格规则及当前禁用高风险内容;seed 不能代替内容验收。
2. 完成项目权限正例/反例、岗位内容映射、大团队批量派发,以及直通车五类真实处理人员绑定。
3. 继续用真实手机复验正式 ASR、麦克风权限、弱网、方言与全网 AI 提供方;密钥只从安全环境注入。
3. 继续用真实手机扩展 ASR 多机型样本,并复验麦克风拒绝、弱网、方言与全网 AI 提供方;密钥只从安全环境注入。
4. BRD 终态仍缺员工对练图像/视频情境、服务录像回放、四川话/粤语真实样本和响应时延证据。
5. 多租户知识平台完成正式租户 ID、空间、授权、外部应用、内容迁移和标准题签字后,才可称业务上线。
@@ -106,8 +106,8 @@
- 发布源:`230dfb4d feat(broadcast): finish multi-role insight experience`,包含此前训练运营、数字师傅 Agent、公司消息 R1—R3 和多岗位解读;当前源码 `acd5fd3a` 的陪练建议回复未包含在本次生产包。
- 生产地址:`https://peilian.njzhmj.top/`、`https://peilian.njzhmj.top/h5/`;本次完整备份:`/opt/wygj/backups/broadcast-insights-20260725152349`。
- 数据库:训练、组织、Agent、`aihr_broadcast_attachment`、多岗位解读、`aihr_direct_feedback` 和五类处理角色迁移已执行;远端 `release-preflight` 对结构的只读核验为 `64/64`。
- 产物与服务:管理端/H5 资源、后端 AIHR 模块均与本地构建一致,`wygj-aihr.service` 为 `active`;根站、H5、租户接口和员工首页 API 返回正常业务结果。
- 认证态生产已验证员工直通匿名提交、审计角色回复、员工查看回复,以及全员文件消息发布、摘要、多岗位解读、下载、内容追问和撤回。直通测试记录按审计要求保留,公司消息测试记录已撤回;该证据不包含 Agent 专项回归、完整训练写入、主管复盘、定向人群正反例或真机媒体体验验收。
- 产物与服务:2026-07-25 完整包曾完成管理端/H5、后端和 schema 三项一致性核验;2026-07-26 后端 ASR 热修复后服务仍为 `active`、新 JAR 哈希匹配且生产 ASR/健康检查通过,但静态资源未重发,因此不得把该单项发布描述为当前工作树的完整包一致。
- 认证态生产已验证员工直通匿名提交、审计角色回复、员工查看回复,以及全员文件消息发布、摘要、多岗位解读、下载、内容追问和撤回;2026-07-26 另完成一台 Android 标准基座的生产 ASR。直通测试记录按审计要求保留,公司消息测试记录已撤回;该证据不包含 Agent 专项完整回归、完整训练写入、主管复盘、定向人群正反例或原生全项体验验收。
## 6. 当前事实源
+6
View File
@@ -27,6 +27,12 @@
- 公司文件多岗位解读已完成生产 H5 认证态验证,包含四视角切换、原文依据、下载哈希一致及撤回后拒绝访问;
- 主管下一训练层级确认和数字师傅 Agent 仅确认结构/产物已部署,尚未完成各自的生产认证态业务回归;不得由 `64/64` 推断业务验收完成。
2026-07-26 已完成后端 ASR 单项热修复:
- 生产 `category=asr` 已切换为 `dashscope/qwen3-asr-flash`,旧 `siliconflow/TeleAI/TeleSpeechASR` 已停用;供应商密钥仍只保存在受控运行配置和模型表,不进入仓库、命令记录或验收材料;
- 生产接口已获得正确转写和受控 `ossId`,Android HBuilderX 标准基座“按住说话”请求成功,服务日志无此前的 403/ASR 异常;
- 回滚目录为 `/opt/wygj/backups/asr-hotfix-20260726210122`,包含原 JAR 与模型配置 SQL。本次未发布管理端/H5/App 静态资源、未变更 schema,不替代完整包预检、自定义基座权限验收、弱网/方言样本或 Agent 专项业务回归。
2026-07-20 增量把“项目服务记忆最小切片”扩展为工作助手确认式统一采集:显式“记一下”生成候选,用户确认后按 `PRIVATE/COMPANY` 写入 `aihr_assistant_capture`;个人记录仅本人可见,公司记录先保持 `PENDING`,正式接收端和回执尚未实现。旧 `aihr_service_memory/version` 继续兼容项目记录;同批会话式“工作上报”继续使用既有 `aihr_work_report`,并补 `request_key/request_hash` 和唯一索引。
2026-07-21 已在生产发布项目化工作助手与今日工作成果提交 `4536d607`,并发布确认卡首屏修正 `11250811`:
+134 -18
View File
@@ -26,7 +26,7 @@
- 管理端:`https://wygj-admin.localhost/`
- 后端 API:`https://wygj-api.localhost`
从根目录一次性启动本地依赖、后端、管理端和 uni-app 用户侧:
Linux/macOS 或已完整配置的 Linux shell 可从根目录一次性启动本地依赖、后端、管理端和 uni-app 用户侧:
```bash
./scripts/dev.sh
@@ -38,16 +38,12 @@
portless run --name wygj-api ./scripts/dev-backend.sh
```
Windows 10/11 + Docker Desktop 不要从 PowerShell 直接执行 `./scripts/dev.sh`:Windows 的 `bash` 可能解析到 WSL,而 WSL 的 Node、Docker 集成和检出文件换行符未必满足脚本要求。使用本文件的 [Windows 10/11 + Docker Desktop](#windows-docker-desktop) 流程。
本地启动默认关闭管理端图形验证码;需要专门验证验证码链路时设置 `AIHR_DEV_CAPTCHA_ENABLED=true`。生产启动不使用该开发开关,验证码保持开启。
重复启动或切换分支时优先使用 `./scripts/dev.sh restart`,停止使用 `./scripts/dev.sh stop`。脚本会递归终止 portless 包装进程及其 Java/Vite 子进程,避免旧后端脱离后继续占用 MySQL 连接池;进程树回归可用 `bash scripts/tests/process-tree.test.sh` 验证。
也可以只让 portless 按根目录 `portless.json` 启动前端工程:
```bash
portless
```
旧 `mobile/` 只在显式 `PORTLESS=0 ./scripts/dev.sh` 时作为固定端口兜底启动;后端开发测试优先看 `wygj-api.localhost`,管理端开发测试优先看 `wygj-admin.localhost`,新用户侧开发测试优先看 `wygj-mobile-uni.localhost`。
原生 Android/iOS 资源使用 `npm --prefix mobile-uni run build:app` 构建;它不生成签名 APK/IPA,也不适用本文件的 H5 `rsync` 发布流程。自定义基座、协议链接、签名和真机门禁见 [MOBILE_APP_PACKAGING.md](MOBILE_APP_PACKAGING.md)。
@@ -91,23 +87,143 @@ AIHR_AI_SPEECH_ENABLED=true
`application-dev.yml` 只保留占位和默认值,不提交真实短信密钥。dev 环境不配阿里云短信也能登录移动端:验证码固定 `123456`。
## 启动步骤
<a id="windows-docker-desktop"></a>
在项目根目录执行:
## Windows 10/11 + Docker Desktop
```bash
./scripts/dev.sh
Windows 推荐让 Docker Desktop 承载 MySQL、Redis、MinIO 和 Qdrant,Java/Vite/portless 仍作为 Windows 进程运行;无需在 Windows 单独安装数据库或 Redis 服务。基础环境要求:
- Docker Desktop 已启动,`docker info` 可连接 daemon
- Git for Windows(使用其 Git Bash 和 OpenSSL)
- JDK 17、Maven
- Node.js 24+、npm、全局 `portless`
- 可选:测试视频解析时另装 `ffmpeg` 和 `ffprobe`
### 1. PowerShell 会话准备
在仓库根目录打开 PowerShell。下面通过 `git.exe` 自动定位 Git for Windows,不依赖仓库或 Git 的固定安装盘符:
```powershell
$gitRoot = Split-Path (Split-Path (Get-Command git).Source -Parent) -Parent
$gitBash = Join-Path $gitRoot 'bin\bash.exe'
$env:Path = "$(Join-Path $gitRoot 'usr\bin');$(Join-Path $gitRoot 'bin');$env:Path"
docker info
docker compose -f docker-compose.dev.yml config --quiet
java -version
mvn -version
node --version
portless --version
portless doctor
```
`./scripts/dev.sh` 默认通过 portless 暴露后端、管理端和当前 `mobile-uni` 用户侧。若要显式使用旧端口调试,可执行 `PORTLESS=0 ./scripts/dev.sh`,后端入口为 `http://127.0.0.1:8080/`,管理端入口为 `http://127.0.0.1:5173/`,旧移动端兜底入口为 `http://127.0.0.1:5174/h5/user`。
若 `portless doctor` 仅提示代理未启动,属于首启正常状态;若提示找不到 OpenSSL,确认本会话已执行上面的 `$env:Path` 设置。首次使用 HTTPS 本地域名时执行一次:
首次启动或需要重建本地 `ry-vue` MVP 数据库时执行:
```bash
./scripts/dev.sh --reset
```powershell
portless trust
```
`--reset` 会删除并重建本地 MVP 数据库,只用于本地开发环境。
公司代理、VPN 或 TUN 软件可能把 `*.localhost` 在 Node.js 中解析到 `198.18.0.0/15`,导致 Vite 页面能打开、`/dev-api` 却返回 `500`。下面的 Windows 流程先让 portless 为后端分配内部端口,再让两个 Vite 代理从 `portless list` 读取该端口并直连 `127.0.0.1`,因此不依赖 Node.js 对 `*.localhost` 的解析,也不要求 `8080` 空闲;浏览器入口仍使用 portless HTTPS 域名。若浏览器本身也无法解析这些域名,可在路由启动后,用**管理员 PowerShell** 执行一次 `portless hosts sync`。
### 2. 首次初始化
首次检出时安装两个当前前端工程的锁定依赖:
```powershell
npm --prefix frontend ci
npm --prefix mobile-uni ci
```
首次创建本地测试库时,通过 Git Bash 执行初始化脚本:
```powershell
& $gitBash ./scripts/reset-dev-db.sh
```
该脚本会在 Docker Desktop 中启动 `wygj-mysql`、`wygj-redis`、`wygj-minio`、`wygj-qdrant`,并**删除后重建**本地 `ry-vue`、导入若依与 AIHR schema/seed。仅首次初始化或明确需要清空本地测试数据时使用。
后续日常启动依赖容器不重建数据:
```powershell
docker compose -f docker-compose.dev.yml up -d mysql redis qdrant minio minio-init
```
基础开发不要求 `.env.local`:dev 短信验证码默认固定为 `123456`,模型调用失败仍保留 seed fallback。真实短信、外部组织同步或外部 AI 模型联调时,再按前文示例创建被 Git 忽略的 `.env.local`。
### 3. 启动后端
新开一个 PowerShell,重复“PowerShell 会话准备”中的 `$gitRoot`、`$gitBash` 和 `$env:Path` 三行,然后执行:
```powershell
portless run --name wygj-api --force bash ./scripts/dev-backend.sh
```
首次启动没有 `backend/ruoyi-admin/target/ruoyi-admin.jar` 时,脚本会先执行 Maven 打包;保持该终端运行。portless 分配的内部端口是动态的,对外入口始终是 `https://wygj-api.localhost/`。
### 4. 启动管理端与 mobile-uni
管理端和 `mobile-uni` 各使用一个 PowerShell,两个终端都先重复“PowerShell 会话准备”中的变量设置。
管理端终端在仓库根目录执行:
```powershell
$apiRoute = (portless list | Select-String 'https://wygj-api\.localhost').Line
$apiPort = [regex]::Match($apiRoute, 'localhost:(\d+)').Groups[1].Value
if (-not $apiPort) { throw 'wygj-api portless route not found' }
$env:VITE_APP_PROXY_TARGET = "http://127.0.0.1:$apiPort"
& $gitBash ./scripts/dev-frontend.sh
```
`mobile-uni` 终端在仓库根目录执行:
```powershell
$apiRoute = (portless list | Select-String 'https://wygj-api\.localhost').Line
$apiPort = [regex]::Match($apiRoute, 'localhost:(\d+)').Groups[1].Value
if (-not $apiPort) { throw 'wygj-api portless route not found' }
Set-Location .\mobile-uni
$env:VITE_PROXY_TARGET = "http://127.0.0.1:$apiPort"
portless run --name wygj-mobile-uni --force npm run dev
```
本机 portless `0.15.4` 在没有根 `package.json` workspace 时不会仅凭 `portless.json` 批量启动两个前端,因此不要用根目录裸命令 `portless` 代替上述两个入口。后端重新启动后内部端口可能变化,此时也要重新启动两个前端以刷新代理目标。保持三个应用终端运行,访问:
- 管理端:`https://wygj-admin.localhost/`
- 用户侧:`https://wygj-mobile-uni.localhost/h5/`
- 后端:`https://wygj-api.localhost/`
### 5. 冒烟与测试
```powershell
$gitBash = Join-Path $gitRoot 'bin\bash.exe'
docker compose -f docker-compose.dev.yml ps
portless list
curl.exe -k -fsS https://wygj-admin.localhost/dev-api/auth/tenant/list
curl.exe -k -fsS https://wygj-admin.localhost/dev-api/auth/code
curl.exe -k -fsS https://wygj-mobile-uni.localhost/dev-api/api/aihr/mobile/home/user
docker exec wygj-mysql mysql -uroot -proot --default-character-set=utf8mb4 -N -B -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='ry-vue';"
docker exec wygj-redis redis-cli -a ruoyi123 ping
curl.exe -fsS http://127.0.0.1:9000/minio/health/live
curl.exe -k -fsS http://127.0.0.1:6333/
npm --prefix mobile-uni run test:unit
npm --prefix mobile-uni run typecheck
npm --prefix frontend run build:dev
mvn -f backend/pom.xml -pl ruoyi-modules/ruoyi-aihr -am -DskipTests=false test
& $gitBash ./scripts/demo-check.sh
```
### 6. 停止
先在后端、管理端和 `mobile-uni` 三个终端按 `Ctrl+C`。需要同时停止代理和依赖容器时执行:
```powershell
portless proxy stop
docker compose -f docker-compose.dev.yml stop
```
日常停止不需要 `docker compose down -v`;当前数据库等数据使用仓库 `.data/` bind mount,只有明确重置时才运行 `reset-dev-db.sh`,不要手工删除 `.data/mysql` 等目录。
## 默认登录
@@ -233,7 +349,7 @@ RELEASE_REMOTE_URL=https://peilian.njzhmj.top RELEASE_VERIFY_REMOTE_MATCH=true R
- 移动端登录后若组织快照接口返回 `401/403`,只降级为手动岗位确认,不应清除手机号登录态;岗位确认页仍需允许员工选择“生活顾问”后继续进入业务页。
- uni-app 主管端:进入 `https://wygj-mobile-uni.localhost/h5/#/pages/supervisor/index/index`,应看到团队概览、团队画像、团队预警、指派专项、待复盘和复盘详情;从团队画像派专项后,最近专项应立即回读新记录。
- uni-app 候选人端:进入 `https://wygj-mobile-uni.localhost/h5/#/pages/candidate/index/index`,手机号登录(dev 验证码固定 `123456`)→ “开始面试/面试练习”完成答题评分;“补充资料”选择 PDF/Word/图片后上传,应看到资料状态。Codex 内置浏览器不支持本地文件选择时,用真实 HTTP multipart smoke 代替浏览器文件选择。
- 真 LLM 激活:在 `/system/model` 给供应商填 api_host/api_key 并启用 `category=chat` 模型后,三角色对练的客户回复与评分即为真实 LLM 生成;再启用 `category=asr/tts`(如硅基流动 SenseVoice/CosyVoice2)语音路径生效。未配置时全链路自动回退 seed。
- 真 LLM 激活:在 `/system/model` 给供应商填 api_host/api_key 并启用 `category=chat` 模型后,三角色对练的客户回复与评分即为真实 LLM 生成;再启用 `category=asr/tts` 语音路径生效。阿里云短音频 ASR 使用 `provider_code=dashscope`、`model_name=qwen3-asr-flash` 和北京工作空间的 `/compatible-mode/v1` Base URL;现有 `backend/.env` 中同一工作空间的 `AIHR_QWEN_REALTIME_ENDPOINT` / `AIHR_QWEN_REALTIME_API_KEY` 可作为本地模型管理的配置来源,但应用不会自动把私密变量导入模型表。密钥只通过模型管理或本地私密配置提供,不写入文档、SQL 或受版本控制配置。SiliconFlow SenseVoice/CosyVoice2 仍作为兼容供应商。未配置时全链路自动回退 seed。
演示前可先跑最小预检:
+4
View File
@@ -10,6 +10,10 @@
4. 每台设备保留系统版本、App `versionName/versionCode`、基座/包哈希、录屏或截图和失败日志。
5. HBuilderX/CLI 编译链必须与手机调试基座兼容;启动时出现版本不匹配弹窗即视为未通过。当前版本组合和排障命令见 `MOBILE_APP_PACKAGING.md`。
## 当前证据边界
2026-07-26 已在 vivo V2443A(Android 15)的 HBuilderX 5.22 标准基座完成手机号登录,并通过生产 `dashscope/qwen3-asr-flash` 跑通“按住说话 → ASR → 提交”链路。该证据只证明单台 Android 标准基座和生产短音频识别,不代表自定义基座、原生隐私弹窗、拒绝权限、弱网、方言、iOS 或下列全项已通过,因此清单继续保持未勾选。
## Android(最低 Android 10 + 一台当前主流机型)
- [ ] 首次启动先显示原生隐私弹窗;两个协议链接可打开,拒绝后退出,同意后才进入登录。
+17 -9
View File
@@ -8,8 +8,8 @@
- App 直接请求 `https://peilian.njzhmj.top/dev-api`。不依赖 H5 开发服务器的 `/dev-api` proxy;地址是公开配置,不得在 App 包中放入短信、模型、签名或任何服务端密钥。
- `manifest.json` 只保留不含秘密的发布配置。`.keystore`、`.p12`、`.mobileprovision` 与证书密码只能由发布负责人在 HBuilderX 云打包界面或受控 CI 秘密变量中提供,绝不能提交 Git。
- Android 最低试点设备为 Android 10,iOS 最低试点设备为 iOS 15;每次发版提升 `versionCode`,再更新 `versionName`。
- 当前 App 编译链与本机 HBuilderX `5.15.2026070915` 标准基座对齐:`@dcloudio/uni-app`、`@dcloudio/uni-app-plus`、`@dcloudio/vite-plugin-uni` 固定为 `3.0.0-alpha-5010220260604001`。这是 HBuilderX/uni-app 编译器版本,不是 Android `minSdkVersion`。
- `@dcloudio/uni-h5` 有意保留 `3.0.0-alpha-5020120260710001`;5.15 内置的 H5 包没有导出项目仍在使用的 `Audio` 组件,会使 `build:h5` 失败。不要为了“版本整齐”把 H5 包一并降级。
- 当前编译链与本机 HBuilderX 5.22 对齐:GUI 产品版本为 `5.22.2026071707`,`D:\HBuilderX\cli.exe version` 返回 `5.22.2026072503-alpha`;`@dcloudio/uni-app`、`@dcloudio/uni-app-plus`、`@dcloudio/uni-h5`、`@dcloudio/vite-plugin-uni` 均固定为 `3.0.0-alpha-5020220260725001`。这是 HBuilderX/uni-app 编译器版本,不是 Android `minSdkVersion`。
- 四个 DCloud 编译包必须保持同一批次;否则 npm 版 uni-ui 的 easycom 解析可能落入不同的 `uni-cli-shared` 实例,表现为 `<uni-forms>`、`<uni-easyinput>` 等组件无法解析。
## 本地验证与出包
@@ -39,7 +39,7 @@ npm --prefix mobile-uni run build:app
- 现有品牌源图仅为 64×64,因此这里生成的是**可用于自定义基座和测试包的派生资产**。正式提交商店前应替换为品牌方提供的高分辨率母版,再重新执行生成和预检。
- `androidPrivacy.json.example` 是**未启用的法务模板**,其中 `__TERMS_URL__` 与 `__PRIVACY_URL__` 必须替换为法务确认的 HTTPS 地址。复制为被 Git 忽略的 `androidPrivacy.json` 后,`npm --prefix mobile-uni run verify:app-release` 才会通过。
- iOS 已按实际功能填写麦克风和照片库用途说明;不申请相机、定位、通讯录、蓝牙或广告追踪权限。
- `build:app` 依赖 `@dcloudio/uni-app-plus`,它必须与 `@dcloudio/uni-app`、`@dcloudio/vite-plugin-uni` 同版本;H5 包是上文说明的平台例外。缺少 App 编译器时命令**不报错**,只静默产出带 `/h5/` 基路径的 H5 空壳,产物里没有 `app-service.js` 与 `app-renderjs.js`,App 平台代码等于从未编译。判定 `build:app` 是否真的成功要看产物中是否存在 `app-service.js`、`app-renderjs.js`、`manifest.json`,不能只看 `DONE Build complete.`。
- `build:app` 依赖 `@dcloudio/uni-app-plus`,它必须与 `@dcloudio/uni-app`、`@dcloudio/uni-h5`、`@dcloudio/vite-plugin-uni` 同版本。缺少 App 编译器时命令**不报错**,只静默产出带 `/h5/` 基路径的 H5 空壳,产物里没有 `app-service.js` 与 `app-renderjs.js`,App 平台代码等于从未编译。判定 `build:app` 是否真的成功要看产物中是否存在 `app-service.js`、`app-renderjs.js`、`manifest.json`,不能只看 `DONE Build complete.`。
- App-Plus 实时对练通过 `renderjs` 在系统 WebView 中执行媒体/WebRTC;认证 SDP 与工具请求仍由逻辑层代理。发布前必须在 Android/iOS 真机验证麦克风授权、实时转写、远端语音播放、前后台切换和断线降级。
- 真机步骤和证据口径见 `docs/MOBILE_APP_DEVICE_ACCEPTANCE.md`。资源预检通过不等于 Android/iOS 真机或应用商店验收通过。
@@ -48,14 +48,22 @@ npm --prefix mobile-uni run build:app
若真机提示“本应用使用 HBuilderX X 或对应 CLI 版本编译,而手机端 SDK 版本是 Y”,先核对编译依赖与基座,不要修改 Android `minSdkVersion`:
```bash
/Applications/HBuilderX.app/Contents/MacOS/cli --version
node -e "for (const n of ['@dcloudio/uni-app','@dcloudio/uni-app-plus','@dcloudio/vite-plugin-uni']) console.log(n, require('./mobile-uni/node_modules/'+n+'/package.json').version)"
/Applications/HBuilderX.app/Contents/MacOS/cli launch app-android \
--project "$PWD/mobile-uni" --deviceId <adb-serial> \
--playground standard --compile true
node -e "for (const n of ['@dcloudio/uni-app','@dcloudio/uni-app-plus','@dcloudio/uni-h5','@dcloudio/vite-plugin-uni']) console.log(n, require('./mobile-uni/node_modules/'+n+'/package.json').version)"
```
当前 5.15 内置包在 `build:app` 输出中显示 `Compiler version: 5.12(vue3)`,属于 DCloud 自身的版本映射;依赖、HBuilderX 和手机标准基座按上述固定版本组合后,真机不再弹出 5.21/5.15 不匹配提示。
Windows PowerShell 再核对 HBuilderX CLI 与设备;项目已导入 HBuilderX 且设备在线后,才执行最后一条运行命令:
```powershell
& 'D:\HBuilderX\cli.exe' version
& 'D:\HBuilderX\cli.exe' devices list --platform android
& 'D:\HBuilderX\cli.exe' launch app-android `
--project (Resolve-Path '.\mobile-uni').Path --deviceId <adb-serial> `
--playground standard --native-log true
```
标准基座可先验证编译器/SDK 兼容、启动和页面交互;完整权限验收必须先生成 5.22 自定义基座,再把上面的 `standard` 改为 `custom` 重跑。不要在真机运行命令中加 `--compile true`,该参数表示“只编译代码”,不会安装或启动手机端应用。
当前项目依赖已与 HBuilderX 5.22 统一;升级后必须重新生成并安装 5.22 自定义运行基座,旧的 5.15 基座不能继续用于真机验收。命令行资源构建通过只证明编译链可用,不等同于已完成真机基座验证。
## 更新策略
+2 -2
View File
@@ -18,7 +18,7 @@
| 文档 | 用途 |
|---|---|
| [../CHANGELOG.md](../CHANGELOG.md) | 按明确时间记录源码、生产发布、线上验证和未验收边界 |
| [DEV_SETUP.md](DEV_SETUP.md) | 本地端口、账号、启动步骤、基础链路验证、管理端与移动端 H5 静态发布 |
| [DEV_SETUP.md](DEV_SETUP.md) | Linux/macOS 与 Windows + Docker Desktop 的本地端口、账号、启动步骤、基础链路验证和静态发布 |
| [MOBILE_APP_PACKAGING.md](MOBILE_APP_PACKAGING.md) | `mobile-uni` Android/iOS 资源构建、隐私/签名边界和出包前置条件 |
| [MOBILE_APP_DEVICE_ACCEPTANCE.md](MOBILE_APP_DEVICE_ACCEPTANCE.md) | Android/iOS 自定义基座或签名包的真机验收清单 |
| [FIGMA_DESIGN_INVENTORY.md](FIGMA_DESIGN_INVENTORY.md) | Figma 页面节点索引、设计批次范围、取消项和全文件一致性审计结果 |
@@ -55,7 +55,7 @@
| [AI陪练二期开发推进计划.md](AI陪练二期开发推进计划.md) | 2026-07-11 历史推进记录;保留 M0-M5 的工程追溯,不再作为当前施工范围 |
| [员工端版本功能对比与功能对齐清单-20260717.md](员工端版本功能对比与功能对齐清单-20260717.md) | 旧版/历史需求/当前实现/生产验收的版本对比,以及 2026-07-17 客户反馈逐项处理结果 |
| [BRD_IMPLEMENTATION_AUDIT.md](BRD_IMPLEMENTATION_AUDIT.md) | 当前生产基线、三端输入/BRD 匹配、客户反馈完成分层和正式试点剩余硬门槛;旧发布流水从当前真相源移除 |
| [BRD_PRODUCTION_MIGRATION_RUNBOOK.md](BRD_PRODUCTION_MIGRATION_RUNBOOK.md) | AIHR BRD 生产 schema/内置内容迁移顺序、64 项结构核验、私有个人资料存储配置和发布后回归口径 |
| [BRD_PRODUCTION_MIGRATION_RUNBOOK.md](BRD_PRODUCTION_MIGRATION_RUNBOOK.md) | AIHR BRD 生产 schema/内置内容迁移顺序、结构核验、当前运行基线、单项热修复回滚和发布后回归口径 |
| [20260708/uni-app用户侧前端重建计划.md](20260708/uni-app用户侧前端重建计划.md) | `mobile-uni/` 重建阶段留档;当前完成状态以 BRD 审查和版本功能对比为准 |
| [20260708/数字师傅学练问报整合方案.md](20260708/数字师傅学练问报整合方案.md) | 产品定义(学练问报+问题榜+学分晋升+个人 AI 助理)及 v1.8 “问”模块 Agent 关联与实施边界 |
| [20260708/发布会演示候选题单.md](20260708/发布会演示候选题单.md) | 2026-07-08 发布会演示候选题单,作为产品讨论留档,不作为阶段一开发入口 |